@@ -144,9 +144,9 @@ namespace ts {
144144 const voidType = createIntrinsicType(TypeFlags.Void, "void");
145145 const neverType = createIntrinsicType(TypeFlags.Never, "never");
146146 const silentNeverType = createIntrinsicType(TypeFlags.Never, "never");
147+ const nonPrimitiveType = createIntrinsicType(TypeFlags.NonPrimitive, "object");
147148
148149 const emptyObjectType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
149- const nonPrimitiveType = createNonPrimitiveType();
150150
151151 const emptyTypeLiteralSymbol = createSymbol(SymbolFlags.TypeLiteral | SymbolFlags.Transient, "__type");
152152 emptyTypeLiteralSymbol.members = createMap<Symbol>();
@@ -1685,13 +1685,6 @@ namespace ts {
16851685 return type;
16861686 }
16871687
1688- function createNonPrimitiveType(): ResolvedType {
1689- const type = setStructuredTypeMembers(
1690- createObjectType(ObjectFlags.NonPrimitive, undefined),
1691- emptySymbols, emptyArray, emptyArray, undefined, undefined);
1692- return type;
1693- }
1694-
16951688 function createObjectType(objectFlags: ObjectFlags, symbol?: Symbol): ObjectType {
16961689 const type = <ObjectType>createType(TypeFlags.Object);
16971690 type.objectFlags = objectFlags;
@@ -2320,9 +2313,6 @@ namespace ts {
23202313 else if (type.flags & TypeFlags.UnionOrIntersection) {
23212314 writeUnionOrIntersectionType(<UnionOrIntersectionType>type, nextFlags);
23222315 }
2323- else if (getObjectFlags(type) & ObjectFlags.NonPrimitive) {
2324- writer.writeKeyword("object");
2325- }
23262316 else if (getObjectFlags(type) & (ObjectFlags.Anonymous | ObjectFlags.Mapped)) {
23272317 writeAnonymousType(<ObjectType>type, nextFlags);
23282318 }
@@ -4771,6 +4761,7 @@ namespace ts {
47714761 t.flags & TypeFlags.NumberLike ? globalNumberType :
47724762 t.flags & TypeFlags.BooleanLike ? globalBooleanType :
47734763 t.flags & TypeFlags.ESSymbol ? getGlobalESSymbolType() :
4764+ t.flags & TypeFlags.NonPrimitive ? globalObjectType :
47744765 t;
47754766 }
47764767
@@ -7153,6 +7144,8 @@ namespace ts {
71537144 if (source.flags & TypeFlags.Enum && target.flags & TypeFlags.Enum && isEnumTypeRelatedTo(<EnumType>source, <EnumType>target, errorReporter)) return true;
71547145 if (source.flags & TypeFlags.Undefined && (!strictNullChecks || target.flags & (TypeFlags.Undefined | TypeFlags.Void))) return true;
71557146 if (source.flags & TypeFlags.Null && (!strictNullChecks || target.flags & TypeFlags.Null)) return true;
7147+ if (source.flags & TypeFlags.Object && target === nonPrimitiveType) return true;
7148+ if (source.flags & TypeFlags.Primitive && target === nonPrimitiveType) return false;
71567149 if (relation === assignableRelation || relation === comparableRelation) {
71577150 if (source.flags & TypeFlags.Any) return true;
71587151 if ((source.flags & TypeFlags.Number | source.flags & TypeFlags.NumberLiteral) && target.flags & TypeFlags.EnumLike) return true;
@@ -7471,7 +7464,7 @@ namespace ts {
74717464 }
74727465 }
74737466 }
7474- else if (!(source.flags & TypeFlags.Primitive && target === nonPrimitiveType)) {
7467+ else {
74757468 if (getObjectFlags(source) & ObjectFlags.Reference && getObjectFlags(target) & ObjectFlags.Reference && (<TypeReference>source).target === (<TypeReference>target).target) {
74767469 // We have type references to same target type, see if relationship holds for all type arguments
74777470 if (result = typeArgumentsRelatedTo(<TypeReference>source, <TypeReference>target, reportErrors)) {
@@ -9224,6 +9217,9 @@ namespace ts {
92249217 }
92259218
92269219 function getTypeFacts(type: Type): TypeFacts {
9220+ if (type === nonPrimitiveType) {
9221+ return strictNullChecks ? TypeFacts.ObjectStrictFacts : TypeFacts.ObjectFacts;
9222+ }
92279223 const flags = type.flags;
92289224 if (flags & TypeFlags.String) {
92299225 return strictNullChecks ? TypeFacts.StringStrictFacts : TypeFacts.StringFacts;
0 commit comments