Skip to content

Commit ae386a9

Browse files
committed
Remove {} from intersection types that already contain object types
1 parent 2b61d18 commit ae386a9

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

src/compiler/checker.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6906,6 +6906,8 @@ namespace ts {
69066906
containsString?: boolean;
69076907
containsNumber?: boolean;
69086908
containsStringOrNumberLiteral?: boolean;
6909+
containsObjectType?: boolean;
6910+
containsEmptyObject?: boolean;
69096911
unionIndex?: number;
69106912
}
69116913

@@ -7101,7 +7103,13 @@ namespace ts {
71017103
else if (type.flags & TypeFlags.Any) {
71027104
typeSet.containsAny = true;
71037105
}
7106+
else if (getObjectFlags(type) & ObjectFlags.Anonymous && isEmptyObjectType(type)) {
7107+
typeSet.containsEmptyObject = true;
7108+
}
71047109
else if (!(type.flags & TypeFlags.Never) && (strictNullChecks || !(type.flags & TypeFlags.Nullable)) && !contains(typeSet, type)) {
7110+
if (type.flags & TypeFlags.Object) {
7111+
typeSet.containsObjectType = true;
7112+
}
71057113
if (type.flags & TypeFlags.Union && typeSet.unionIndex === undefined) {
71067114
typeSet.unionIndex = typeSet.length;
71077115
}
@@ -7139,6 +7147,9 @@ namespace ts {
71397147
if (typeSet.containsAny) {
71407148
return anyType;
71417149
}
7150+
if (typeSet.containsEmptyObject && !typeSet.containsObjectType) {
7151+
typeSet.push(emptyObjectType);
7152+
}
71427153
if (typeSet.length === 1) {
71437154
return typeSet[0];
71447155
}
@@ -8309,6 +8320,18 @@ namespace ts {
83098320
}
83108321
}
83118322

8323+
function isEmptyResolvedType(t: ResolvedType) {
8324+
return t.properties.length === 0 &&
8325+
t.callSignatures.length === 0 &&
8326+
t.constructSignatures.length === 0 &&
8327+
!t.stringIndexInfo &&
8328+
!t.numberIndexInfo;
8329+
}
8330+
8331+
function isEmptyObjectType(type: Type) {
8332+
return type.flags & TypeFlags.Object && isEmptyResolvedType(resolveStructuredTypeMembers(<ObjectType>type));
8333+
}
8334+
83128335
function isEnumTypeRelatedTo(source: EnumType, target: EnumType, errorReporter?: ErrorReporter) {
83138336
if (source === target) {
83148337
return true;
@@ -8644,18 +8667,6 @@ namespace ts {
86448667
return false;
86458668
}
86468669

8647-
function isEmptyResolvedType(t: ResolvedType) {
8648-
return t.properties.length === 0 &&
8649-
t.callSignatures.length === 0 &&
8650-
t.constructSignatures.length === 0 &&
8651-
!t.stringIndexInfo &&
8652-
!t.numberIndexInfo;
8653-
}
8654-
8655-
function isEmptyObjectType(type: Type) {
8656-
return type.flags & TypeFlags.Object && isEmptyResolvedType(resolveStructuredTypeMembers(<ObjectType>type));
8657-
}
8658-
86598670
function hasExcessProperties(source: FreshObjectLiteralType, target: Type, reportErrors: boolean): boolean {
86608671
if (maybeTypeOfKind(target, TypeFlags.Object) && !(getObjectFlags(target) & ObjectFlags.ObjectLiteralPatternWithComputedProperties)) {
86618672
const isComparingJsxAttributes = !!(source.flags & TypeFlags.JsxAttributes);

0 commit comments

Comments
 (0)