@@ -10202,7 +10202,7 @@ namespace ts {
10202
10202
}
10203
10203
10204
10204
function getPropertiesOfType(type: Type): Symbol[] {
10205
- type = getApparentType(getReducedType( type) );
10205
+ type = getReducedApparentType( type);
10206
10206
return type.flags & TypeFlags.UnionOrIntersection ?
10207
10207
getPropertiesOfUnionOrIntersectionType(<UnionType>type) :
10208
10208
getPropertiesOfObjectType(type);
@@ -10558,6 +10558,14 @@ namespace ts {
10558
10558
t;
10559
10559
}
10560
10560
10561
+ function getReducedApparentType(type: Type): Type {
10562
+ // Since getApparentType may return a non-reduced union or intersection type, we need to perform
10563
+ // type reduction both before and after obtaining the apparent type. For example, given a type parameter
10564
+ // 'T extends A | B', the type 'T & X' becomes 'A & X | B & X' after obtaining the apparent type, and
10565
+ // that type may need futher reduction to remove empty intersections.
10566
+ return getReducedType(getApparentType(getReducedType(type)));
10567
+ }
10568
+
10561
10569
function createUnionOrIntersectionProperty(containingType: UnionOrIntersectionType, name: __String): Symbol | undefined {
10562
10570
let singleProp: Symbol | undefined;
10563
10571
let propSet: Map<Symbol> | undefined;
@@ -10779,7 +10787,7 @@ namespace ts {
10779
10787
* @param name a name of property to look up in a given type
10780
10788
*/
10781
10789
function getPropertyOfType(type: Type, name: __String): Symbol | undefined {
10782
- type = getApparentType(getReducedType( type) );
10790
+ type = getReducedApparentType( type);
10783
10791
if (type.flags & TypeFlags.Object) {
10784
10792
const resolved = resolveStructuredTypeMembers(<ObjectType>type);
10785
10793
const symbol = resolved.members.get(name);
@@ -10817,7 +10825,7 @@ namespace ts {
10817
10825
* maps primitive types and type parameters are to their apparent types.
10818
10826
*/
10819
10827
function getSignaturesOfType(type: Type, kind: SignatureKind): readonly Signature[] {
10820
- return getSignaturesOfStructuredType(getApparentType(getReducedType( type) ), kind);
10828
+ return getSignaturesOfStructuredType(getReducedApparentType( type), kind);
10821
10829
}
10822
10830
10823
10831
function getIndexInfoOfStructuredType(type: Type, kind: IndexKind): IndexInfo | undefined {
@@ -10835,13 +10843,13 @@ namespace ts {
10835
10843
// Return the indexing info of the given kind in the given type. Creates synthetic union index types when necessary and
10836
10844
// maps primitive types and type parameters are to their apparent types.
10837
10845
function getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined {
10838
- return getIndexInfoOfStructuredType(getApparentType(getReducedType( type) ), kind);
10846
+ return getIndexInfoOfStructuredType(getReducedApparentType( type), kind);
10839
10847
}
10840
10848
10841
10849
// Return the index type of the given kind in the given type. Creates synthetic union index types when necessary and
10842
10850
// maps primitive types and type parameters are to their apparent types.
10843
10851
function getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined {
10844
- return getIndexTypeOfStructuredType(getApparentType(getReducedType( type) ), kind);
10852
+ return getIndexTypeOfStructuredType(getReducedApparentType( type), kind);
10845
10853
}
10846
10854
10847
10855
function getImplicitIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined {
@@ -13215,7 +13223,7 @@ namespace ts {
13215
13223
// In the following we resolve T[K] to the type of the property in T selected by K.
13216
13224
// We treat boolean as different from other unions to improve errors;
13217
13225
// skipping straight to getPropertyTypeForIndexType gives errors with 'boolean' instead of 'true'.
13218
- const apparentObjectType = getApparentType(getReducedType( objectType) );
13226
+ const apparentObjectType = getReducedApparentType( objectType);
13219
13227
if (indexType.flags & TypeFlags.Union && !(indexType.flags & TypeFlags.Boolean)) {
13220
13228
const propTypes: Type[] = [];
13221
13229
let wasMissingProp = false;
0 commit comments