mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-06 20:14:01 -06:00
Compare type parameters, constraints, and defaults in signature identity
This commit is contained in:
parent
be4147ddf3
commit
ea0a6de82f
@ -14322,20 +14322,25 @@ namespace ts {
|
||||
if (!(isMatchingSignature(source, target, partialMatch))) {
|
||||
return Ternary.False;
|
||||
}
|
||||
// Check that the two signatures have the same number of type parameters. We might consider
|
||||
// also checking that any type parameter constraints match, but that would require instantiating
|
||||
// the constraints with a common set of type arguments to get relatable entities in places where
|
||||
// type parameters occur in the constraints. The complexity of doing that doesn't seem worthwhile,
|
||||
// particularly as we're comparing erased versions of the signatures below.
|
||||
// Check that the two signatures have the same number of type parameters.
|
||||
if (length(source.typeParameters) !== length(target.typeParameters)) {
|
||||
return Ternary.False;
|
||||
}
|
||||
// Spec 1.0 Section 3.8.3 & 3.8.4:
|
||||
// M and N (the signatures) are instantiated using type Any as the type argument for all type parameters declared by M and N
|
||||
source = getErasedSignature(source);
|
||||
target = getErasedSignature(target);
|
||||
// Check that type parameter constraints and defaults match. If they do, instantiate the source
|
||||
// signature with the type parameters of the target signature and continue the comparison.
|
||||
if (target.typeParameters) {
|
||||
const mapper = createTypeMapper(source.typeParameters!, target.typeParameters);
|
||||
for (let i = 0; i < target.typeParameters.length; i++) {
|
||||
const s = source.typeParameters![i];
|
||||
const t = target.typeParameters[i];
|
||||
if (!(s === t || compareTypes(instantiateType(getConstraintFromTypeParameter(s), mapper) || unknownType, getConstraintFromTypeParameter(t) || unknownType) &&
|
||||
compareTypes(instantiateType(getDefaultFromTypeParameter(s), mapper) || unknownType, getDefaultFromTypeParameter(t) || unknownType))) {
|
||||
return Ternary.False;
|
||||
}
|
||||
}
|
||||
source = instantiateSignature(source, mapper, /*eraseTypeParameters*/ true);
|
||||
}
|
||||
let result = Ternary.True;
|
||||
|
||||
if (!ignoreThisTypes) {
|
||||
const sourceThisType = getThisTypeOfSignature(source);
|
||||
if (sourceThisType) {
|
||||
@ -14349,7 +14354,6 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const targetLen = getParameterCount(target);
|
||||
for (let i = 0; i < targetLen; i++) {
|
||||
const s = getTypeAtPosition(source, i);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user