@@ -146,6 +146,7 @@ namespace ts {
146
146
const silentNeverType = createIntrinsicType(TypeFlags.Never, "never");
147
147
148
148
const emptyObjectType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
149
+ const nonPrimitiveType = createNonPrimitiveType();
149
150
150
151
const emptyTypeLiteralSymbol = createSymbol(SymbolFlags.TypeLiteral | SymbolFlags.Transient, "__type");
151
152
emptyTypeLiteralSymbol.members = createMap<Symbol>();
@@ -1684,6 +1685,14 @@ namespace ts {
1684
1685
return type;
1685
1686
}
1686
1687
1688
+ function createNonPrimitiveType(): NonPrimitiveType {
1689
+ const type = <NonPrimitiveType>setStructuredTypeMembers(
1690
+ createObjectType(ObjectFlags.NonPrimitive, undefined),
1691
+ emptySymbols, emptyArray, emptyArray, undefined, undefined);
1692
+ type.intrinsicName = "object";
1693
+ return type;
1694
+ }
1695
+
1687
1696
function createObjectType(objectFlags: ObjectFlags, symbol?: Symbol): ObjectType {
1688
1697
const type = <ObjectType>createType(TypeFlags.Object);
1689
1698
type.objectFlags = objectFlags;
@@ -4178,6 +4187,7 @@ namespace ts {
4178
4187
case SyntaxKind.NumberKeyword:
4179
4188
case SyntaxKind.BooleanKeyword:
4180
4189
case SyntaxKind.SymbolKeyword:
4190
+ case SyntaxKind.ObjectKeyword:
4181
4191
case SyntaxKind.VoidKeyword:
4182
4192
case SyntaxKind.UndefinedKeyword:
4183
4193
case SyntaxKind.NullKeyword:
@@ -6384,6 +6394,8 @@ namespace ts {
6384
6394
return nullType;
6385
6395
case SyntaxKind.NeverKeyword:
6386
6396
return neverType;
6397
+ case SyntaxKind.ObjectKeyword:
6398
+ return nonPrimitiveType;
6387
6399
case SyntaxKind.JSDocNullKeyword:
6388
6400
return nullType;
6389
6401
case SyntaxKind.JSDocUndefinedKeyword:
@@ -7139,6 +7151,7 @@ namespace ts {
7139
7151
if (source.flags & TypeFlags.Enum && target.flags & TypeFlags.Enum && isEnumTypeRelatedTo(<EnumType>source, <EnumType>target, errorReporter)) return true;
7140
7152
if (source.flags & TypeFlags.Undefined && (!strictNullChecks || target.flags & (TypeFlags.Undefined | TypeFlags.Void))) return true;
7141
7153
if (source.flags & TypeFlags.Null && (!strictNullChecks || target.flags & TypeFlags.Null)) return true;
7154
+ if (source.flags & TypeFlags.Object && (<ObjectType>source).objectFlags & ObjectFlags.NonPrimitive && target.flags & TypeFlags.Primitive) return false;
7142
7155
if (relation === assignableRelation || relation === comparableRelation) {
7143
7156
if (source.flags & TypeFlags.Any) return true;
7144
7157
if ((source.flags & TypeFlags.Number | source.flags & TypeFlags.NumberLiteral) && target.flags & TypeFlags.EnumLike) return true;
0 commit comments