@@ -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