From 81326ac90178a5a481412dab32fc458cb45be4e5 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 1 Nov 2017 09:16:16 -0700 Subject: [PATCH] Properly handle Object and Function types --- src/compiler/checker.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9cd21263b8d..1fd70a22b67 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8571,14 +8571,16 @@ 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 + // 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 // inheritance hierarchy. 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)) : + target === globalObjectType || target === globalFunctionType ? isTypeSubtypeOf(source, target) : hasBaseType(source, getTargetType(target)); - } + } /** * This is *not* a bi-directional relationship.