From b4b711ff5c7e5f07db43c139309b4e34fdcda853 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 23 Oct 2017 12:35:11 -0700 Subject: [PATCH] Infer from base constraint signatures instead of erased signatures --- src/compiler/checker.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index da3dac4d605..6938ed8d77f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6726,6 +6726,16 @@ namespace ts { isInJavaScriptFile(signature.declaration)); } + function getBaseSignature(signature: Signature) { + const typeParameters = signature.typeParameters; + if (typeParameters) { + const typeEraser = createTypeEraser(typeParameters); + const baseConstraints = map(typeParameters, tp => instantiateType(getBaseConstraintOfType(tp), typeEraser) || emptyObjectType); + return instantiateSignature(signature, createTypeMapper(typeParameters, baseConstraints), /*eraseTypeParameters*/ true); + } + return signature; + } + function getOrCreateTypeFromSignature(signature: Signature): ObjectType { // There are two ways to declare a construct signature, one is by declaring a class constructor // using the constructor keyword, and the other is declaring a bare construct signature in an @@ -10955,7 +10965,7 @@ namespace ts { const targetLen = targetSignatures.length; const len = sourceLen < targetLen ? sourceLen : targetLen; for (let i = 0; i < len; i++) { - inferFromSignature(getErasedSignature(sourceSignatures[sourceLen - len + i]), getErasedSignature(targetSignatures[targetLen - len + i])); + inferFromSignature(getBaseSignature(sourceSignatures[sourceLen - len + i]), getBaseSignature(targetSignatures[targetLen - len + i])); } }