From 40579472a2fa6923f0134de478b5ab42d7716c42 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sun, 19 Nov 2017 09:50:33 -0800 Subject: [PATCH] Handle type variables in isTypeDerivedFrom --- src/compiler/checker.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index cde61bb407..a69fafb637 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8868,6 +8868,7 @@ namespace ts { // An object type S is considered to be derived from an object type T if // S is a union type and every constituent of S is derived from T, // T is a union type and S is derived from at least one constituent of T, or + // S is a type variable with a base constraint that is derived from T, // T is one of the global types Object and Function and S is a subtype of T, or // T occurs directly or indirectly in an 'extends' clause of S. // Note that this check ignores type parameters and only considers the @@ -8875,6 +8876,7 @@ namespace ts { function isTypeDerivedFrom(source: Type, target: Type): boolean { return source.flags & TypeFlags.Union ? every((source).types, t => isTypeDerivedFrom(t, target)) : target.flags & TypeFlags.Union ? some((target).types, t => isTypeDerivedFrom(source, t)) : + source.flags & TypeFlags.TypeVariable ? isTypeDerivedFrom(getBaseConstraintOfType(source) || emptyObjectType, target) : target === globalObjectType || target === globalFunctionType ? isTypeSubtypeOf(source, target) : hasBaseType(source, getTargetType(target)); }