Skip to content

Commit e03cb80

Browse files
committed
Perform intersection reduction before and after getApparentType
1 parent 9725d62 commit e03cb80

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

Diff for: src/compiler/checker.ts

+14-6
Original file line numberDiff line numberDiff line change
@@ -10202,7 +10202,7 @@ namespace ts {
1020210202
}
1020310203

1020410204
function getPropertiesOfType(type: Type): Symbol[] {
10205-
type = getApparentType(getReducedType(type));
10205+
type = getReducedApparentType(type);
1020610206
return type.flags & TypeFlags.UnionOrIntersection ?
1020710207
getPropertiesOfUnionOrIntersectionType(<UnionType>type) :
1020810208
getPropertiesOfObjectType(type);
@@ -10558,6 +10558,14 @@ namespace ts {
1055810558
t;
1055910559
}
1056010560

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+
1056110569
function createUnionOrIntersectionProperty(containingType: UnionOrIntersectionType, name: __String): Symbol | undefined {
1056210570
let singleProp: Symbol | undefined;
1056310571
let propSet: Map<Symbol> | undefined;
@@ -10779,7 +10787,7 @@ namespace ts {
1077910787
* @param name a name of property to look up in a given type
1078010788
*/
1078110789
function getPropertyOfType(type: Type, name: __String): Symbol | undefined {
10782-
type = getApparentType(getReducedType(type));
10790+
type = getReducedApparentType(type);
1078310791
if (type.flags & TypeFlags.Object) {
1078410792
const resolved = resolveStructuredTypeMembers(<ObjectType>type);
1078510793
const symbol = resolved.members.get(name);
@@ -10817,7 +10825,7 @@ namespace ts {
1081710825
* maps primitive types and type parameters are to their apparent types.
1081810826
*/
1081910827
function getSignaturesOfType(type: Type, kind: SignatureKind): readonly Signature[] {
10820-
return getSignaturesOfStructuredType(getApparentType(getReducedType(type)), kind);
10828+
return getSignaturesOfStructuredType(getReducedApparentType(type), kind);
1082110829
}
1082210830

1082310831
function getIndexInfoOfStructuredType(type: Type, kind: IndexKind): IndexInfo | undefined {
@@ -10835,13 +10843,13 @@ namespace ts {
1083510843
// Return the indexing info of the given kind in the given type. Creates synthetic union index types when necessary and
1083610844
// maps primitive types and type parameters are to their apparent types.
1083710845
function getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined {
10838-
return getIndexInfoOfStructuredType(getApparentType(getReducedType(type)), kind);
10846+
return getIndexInfoOfStructuredType(getReducedApparentType(type), kind);
1083910847
}
1084010848

1084110849
// Return the index type of the given kind in the given type. Creates synthetic union index types when necessary and
1084210850
// maps primitive types and type parameters are to their apparent types.
1084310851
function getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined {
10844-
return getIndexTypeOfStructuredType(getApparentType(getReducedType(type)), kind);
10852+
return getIndexTypeOfStructuredType(getReducedApparentType(type), kind);
1084510853
}
1084610854

1084710855
function getImplicitIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined {
@@ -13215,7 +13223,7 @@ namespace ts {
1321513223
// In the following we resolve T[K] to the type of the property in T selected by K.
1321613224
// We treat boolean as different from other unions to improve errors;
1321713225
// skipping straight to getPropertyTypeForIndexType gives errors with 'boolean' instead of 'true'.
13218-
const apparentObjectType = getApparentType(getReducedType(objectType));
13226+
const apparentObjectType = getReducedApparentType(objectType);
1321913227
if (indexType.flags & TypeFlags.Union && !(indexType.flags & TypeFlags.Boolean)) {
1322013228
const propTypes: Type[] = [];
1322113229
let wasMissingProp = false;

0 commit comments

Comments
 (0)