@@ -108,16 +108,16 @@ namespace ts {
108
108
const unknownSymbol = createSymbol(SymbolFlags.Property | SymbolFlags.Transient, "unknown");
109
109
const resolvingSymbol = createSymbol(SymbolFlags.Transient, "__resolving__");
110
110
111
- const nullableWideningFlags = strictNullChecks ? 0 : TypeFlags.ContainsUndefinedOrNull;
112
111
const anyType = createIntrinsicType(TypeFlags.Any, "any");
113
112
const stringType = createIntrinsicType(TypeFlags.String, "string");
114
113
const numberType = createIntrinsicType(TypeFlags.Number, "number");
115
114
const booleanType = createIntrinsicType(TypeFlags.Boolean, "boolean");
116
115
const esSymbolType = createIntrinsicType(TypeFlags.ESSymbol, "symbol");
117
116
const voidType = createIntrinsicType(TypeFlags.Void, "void");
118
- const undefinedType = createIntrinsicType(TypeFlags.Undefined | nullableWideningFlags, "undefined");
119
- const nullType = createIntrinsicType(TypeFlags.Null | nullableWideningFlags, "null");
120
- const emptyArrayElementType = createIntrinsicType(TypeFlags.Undefined | TypeFlags.ContainsUndefinedOrNull, "undefined");
117
+ const undefinedType = createIntrinsicType(TypeFlags.Undefined, "undefined");
118
+ const undefinedWideningType = strictNullChecks ? undefinedType : createIntrinsicType(TypeFlags.Undefined | TypeFlags.ContainsWideningType, "undefined");
119
+ const nullType = createIntrinsicType(TypeFlags.Null, "null");
120
+ const nullWideningType = strictNullChecks ? nullType : createIntrinsicType(TypeFlags.Null | TypeFlags.ContainsWideningType, "null");
121
121
const unknownType = createIntrinsicType(TypeFlags.Any, "unknown");
122
122
const neverType = createIntrinsicType(TypeFlags.Never, "never");
123
123
@@ -3403,7 +3403,7 @@ namespace ts {
3403
3403
error(type.symbol.valueDeclaration, Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_base_expression, symbolToString(type.symbol));
3404
3404
return type.resolvedBaseConstructorType = unknownType;
3405
3405
}
3406
- if (baseConstructorType !== unknownType && baseConstructorType !== nullType && !isConstructorType(baseConstructorType)) {
3406
+ if (baseConstructorType !== unknownType && baseConstructorType !== nullWideningType && !isConstructorType(baseConstructorType)) {
3407
3407
error(baseTypeNode.expression, Diagnostics.Type_0_is_not_a_constructor_function_type, typeToString(baseConstructorType));
3408
3408
return type.resolvedBaseConstructorType = unknownType;
3409
3409
}
@@ -5009,6 +5009,7 @@ namespace ts {
5009
5009
containsAny?: boolean;
5010
5010
containsUndefined?: boolean;
5011
5011
containsNull?: boolean;
5012
+ containsNonWideningType?: boolean;
5012
5013
}
5013
5014
5014
5015
function addTypeToSet(typeSet: TypeSet, type: Type, typeSetKind: TypeFlags) {
@@ -5019,6 +5020,7 @@ namespace ts {
5019
5020
if (type.flags & TypeFlags.Any) typeSet.containsAny = true;
5020
5021
if (type.flags & TypeFlags.Undefined) typeSet.containsUndefined = true;
5021
5022
if (type.flags & TypeFlags.Null) typeSet.containsNull = true;
5023
+ if (!(type.flags & TypeFlags.ContainsWideningType)) typeSet.containsNonWideningType = true;
5022
5024
}
5023
5025
else if (type !== neverType && !contains(typeSet, type)) {
5024
5026
typeSet.push(type);
@@ -5079,8 +5081,8 @@ namespace ts {
5079
5081
removeSubtypes(typeSet);
5080
5082
}
5081
5083
if (typeSet.length === 0) {
5082
- return typeSet.containsNull ? nullType :
5083
- typeSet.containsUndefined ? undefinedType :
5084
+ return typeSet.containsNull ? typeSet.containsNonWideningType ? nullType : nullWideningType :
5085
+ typeSet.containsUndefined ? typeSet.containsNonWideningType ? undefinedType : undefinedWideningType :
5084
5086
neverType;
5085
5087
}
5086
5088
else if (typeSet.length === 1) {
@@ -5880,7 +5882,7 @@ namespace ts {
5880
5882
if (!(target.flags & TypeFlags.Never)) {
5881
5883
if (target.flags & TypeFlags.Any || source.flags & TypeFlags.Never) return Ternary.True;
5882
5884
if (source.flags & TypeFlags.Undefined) {
5883
- if (!strictNullChecks || target.flags & (TypeFlags.Undefined | TypeFlags.Void) || source === emptyArrayElementType ) return Ternary.True;
5885
+ if (!strictNullChecks || target.flags & (TypeFlags.Undefined | TypeFlags.Void)) return Ternary.True;
5884
5886
}
5885
5887
if (source.flags & TypeFlags.Null) {
5886
5888
if (!strictNullChecks || target.flags & TypeFlags.Null) return Ternary.True;
@@ -6970,7 +6972,7 @@ namespace ts {
6970
6972
if (type.flags & TypeFlags.ObjectLiteral) {
6971
6973
for (const p of getPropertiesOfObjectType(type)) {
6972
6974
const t = getTypeOfSymbol(p);
6973
- if (t.flags & TypeFlags.ContainsUndefinedOrNull ) {
6975
+ if (t.flags & TypeFlags.ContainsWideningType ) {
6974
6976
if (!reportWideningErrorsInType(t)) {
6975
6977
error(p.valueDeclaration, Diagnostics.Object_literal_s_property_0_implicitly_has_an_1_type, p.name, typeToString(getWidenedType(t)));
6976
6978
}
@@ -7017,7 +7019,7 @@ namespace ts {
7017
7019
}
7018
7020
7019
7021
function reportErrorsFromWidening(declaration: Declaration, type: Type) {
7020
- if (produceDiagnostics && compilerOptions.noImplicitAny && type.flags & TypeFlags.ContainsUndefinedOrNull ) {
7022
+ if (produceDiagnostics && compilerOptions.noImplicitAny && type.flags & TypeFlags.ContainsWideningType ) {
7021
7023
// Report implicit any error within type if possible, otherwise report error on declaration
7022
7024
if (!reportWideningErrorsInType(type)) {
7023
7025
reportImplicitAnyError(declaration, type);
@@ -8309,7 +8311,7 @@ namespace ts {
8309
8311
const classInstanceType = <InterfaceType>getDeclaredTypeOfSymbol(classSymbol);
8310
8312
const baseConstructorType = getBaseConstructorTypeOfClass(classInstanceType);
8311
8313
8312
- return baseConstructorType === nullType ;
8314
+ return baseConstructorType === nullWideningType ;
8313
8315
}
8314
8316
8315
8317
function checkThisExpression(node: Node): Type {
@@ -9200,7 +9202,7 @@ namespace ts {
9200
9202
}
9201
9203
}
9202
9204
}
9203
- return createArrayType(elementTypes.length ? getUnionType(elementTypes) : emptyArrayElementType );
9205
+ return createArrayType(elementTypes.length ? getUnionType(elementTypes) : strictNullChecks ? neverType : undefinedWideningType );
9204
9206
}
9205
9207
9206
9208
function isNumericName(name: DeclarationName): boolean {
@@ -12004,7 +12006,7 @@ namespace ts {
12004
12006
12005
12007
function checkVoidExpression(node: VoidExpression): Type {
12006
12008
checkExpression(node.expression);
12007
- return undefinedType ;
12009
+ return undefinedWideningType ;
12008
12010
}
12009
12011
12010
12012
function checkAwaitExpression(node: AwaitExpression): Type {
@@ -12411,7 +12413,7 @@ namespace ts {
12411
12413
case SyntaxKind.InKeyword:
12412
12414
return checkInExpression(left, right, leftType, rightType);
12413
12415
case SyntaxKind.AmpersandAmpersandToken:
12414
- return addNullableKind(rightType, getNullableKind(leftType));
12416
+ return strictNullChecks ? addNullableKind(rightType, getNullableKind(leftType)) : rightType ;
12415
12417
case SyntaxKind.BarBarToken:
12416
12418
return getUnionType([getNonNullableType(leftType), rightType]);
12417
12419
case SyntaxKind.EqualsToken:
@@ -12678,7 +12680,7 @@ namespace ts {
12678
12680
case SyntaxKind.SuperKeyword:
12679
12681
return checkSuperExpression(node);
12680
12682
case SyntaxKind.NullKeyword:
12681
- return nullType ;
12683
+ return nullWideningType ;
12682
12684
case SyntaxKind.TrueKeyword:
12683
12685
case SyntaxKind.FalseKeyword:
12684
12686
return booleanType;
@@ -12736,7 +12738,7 @@ namespace ts {
12736
12738
case SyntaxKind.SpreadElementExpression:
12737
12739
return checkSpreadElementExpression(<SpreadElementExpression>node, contextualMapper);
12738
12740
case SyntaxKind.OmittedExpression:
12739
- return undefinedType ;
12741
+ return undefinedWideningType ;
12740
12742
case SyntaxKind.YieldExpression:
12741
12743
return checkYieldExpression(<YieldExpression>node);
12742
12744
case SyntaxKind.JsxExpression:
@@ -17728,7 +17730,7 @@ namespace ts {
17728
17730
// Setup global builtins
17729
17731
addToSymbolTable(globals, builtinGlobals, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0);
17730
17732
17731
- getSymbolLinks(undefinedSymbol).type = undefinedType ;
17733
+ getSymbolLinks(undefinedSymbol).type = undefinedWideningType ;
17732
17734
getSymbolLinks(argumentsSymbol).type = getGlobalType("IArguments");
17733
17735
getSymbolLinks(unknownSymbol).type = unknownType;
17734
17736
0 commit comments