Skip to content

Commit 6fc08ea

Browse files
committed
Clean up and address CR feedback
1 parent 6f94314 commit 6fc08ea

File tree

3 files changed

+25
-39
lines changed

3 files changed

+25
-39
lines changed

src/compiler/checker.ts

+25-30
Original file line numberDiff line numberDiff line change
@@ -3943,7 +3943,7 @@ namespace ts {
39433943
let id = getTypeListId(elementTypes);
39443944
let type = tupleTypes[id];
39453945
if (!type) {
3946-
type = tupleTypes[id] = <TupleType>createObjectType(TypeFlags.Tuple);
3946+
type = tupleTypes[id] = <TupleType>createObjectType(TypeFlags.Tuple | getWideningFlagsOfTypes(elementTypes));
39473947
type.elementTypes = elementTypes;
39483948
}
39493949
return type;
@@ -5300,7 +5300,7 @@ namespace ts {
53005300
* Prefer using isTupleLikeType() unless the use of `elementTypes` is required.
53015301
*/
53025302
function isTupleType(type: Type): type is TupleType {
5303-
return (type.flags & TypeFlags.Tuple) && !!(<TupleType>type).elementTypes;
5303+
return !!(type.flags & TypeFlags.Tuple);
53045304
}
53055305

53065306
function getWidenedTypeOfObjectLiteral(type: Type): Type {
@@ -5348,39 +5348,41 @@ namespace ts {
53485348
return type;
53495349
}
53505350

5351-
function reportWideningErrorsInType(type: Type, expression: Expression): boolean {
5351+
/**
5352+
* Reports implicit any errors that occur as a result of widening 'null' and 'undefined'
5353+
* to 'any'. A call to reportWideningErrorsInType is normally accompanied by a call to
5354+
* getWidenedType. But in some cases getWidenedType is called without reporting errors
5355+
* (type argument inference is an example).
5356+
*
5357+
* The return value indicates whether an error was in fact reported. The particular circumstances
5358+
* are on a best effort basis. Currently, if the null or undefined that causes widening is inside
5359+
* an object literal property (arbitrarily deeply), this function reports an error. If no error is
5360+
* reported, reportImplicitAnyError is a suitable fallback to report a general error.
5361+
*/
5362+
function reportWideningErrorsInType(type: Type): boolean {
53525363
let errorReported = false;
53535364
if (type.flags & TypeFlags.Union) {
53545365
for (let t of (<UnionType>type).types) {
5355-
if (reportWideningErrorsInType(t, expression)) {
5366+
if (reportWideningErrorsInType(t)) {
53565367
errorReported = true;
53575368
}
53585369
}
53595370
}
53605371
if (isArrayType(type)) {
5361-
return reportWideningErrorsInType((<TypeReference>type).typeArguments[0], expression);
5372+
return reportWideningErrorsInType((<TypeReference>type).typeArguments[0]);
53625373
}
53635374
if (isTupleType(type)) {
5364-
let { elementTypes } = type;
5365-
for (let i = 0; i < elementTypes.length; i++) {
5366-
let t = elementTypes[i];
5367-
if (t.flags & TypeFlags.ContainsUndefinedOrNull) {
5368-
if (reportWideningErrorsInType(t, expression)) {
5369-
errorReported = true;
5370-
}
5371-
else if (expression.kind === SyntaxKind.ArrayLiteralExpression) {
5372-
let element = (<ArrayLiteralExpression>expression).elements[i];
5373-
error(element, Diagnostics.Array_element_at_index_0_implicitly_has_an_1_type, i, typeToString(getWidenedType(t)));
5374-
errorReported = true;
5375-
}
5375+
for (let t of type.elementTypes) {
5376+
if (reportWideningErrorsInType(t)) {
5377+
errorReported = true;
53765378
}
53775379
}
53785380
}
53795381
if (type.flags & TypeFlags.ObjectLiteral) {
53805382
for (let p of getPropertiesOfObjectType(type)) {
53815383
let t = getTypeOfSymbol(p);
53825384
if (t.flags & TypeFlags.ContainsUndefinedOrNull) {
5383-
if (!reportWideningErrorsInType(t, expression)) {
5385+
if (!reportWideningErrorsInType(t)) {
53845386
error(p.valueDeclaration, Diagnostics.Object_literal_s_property_0_implicitly_has_an_1_type, p.name, typeToString(getWidenedType(t)));
53855387
}
53865388
errorReported = true;
@@ -5425,7 +5427,7 @@ namespace ts {
54255427
function reportErrorsFromWidening(declaration: Declaration, type: Type) {
54265428
if (produceDiagnostics && compilerOptions.noImplicitAny && type.flags & TypeFlags.ContainsUndefinedOrNull) {
54275429
// Report implicit any error within type if possible, otherwise report error on declaration
5428-
if (!reportWideningErrorsInType(type, declaration.kind === SyntaxKind.VariableDeclaration && (<VariableDeclaration>declaration).initializer)) {
5430+
if (!reportWideningErrorsInType(type)) {
54295431
reportImplicitAnyError(declaration, type);
54305432
}
54315433
}
@@ -6801,7 +6803,6 @@ namespace ts {
68016803
let hasSpreadElement = false;
68026804
let elementTypes: Type[] = [];
68036805
let inDestructuringPattern = isAssignmentTarget(node);
6804-
let typeFlags: TypeFlags;
68056806
for (let e of elements) {
68066807
if (inDestructuringPattern && e.kind === SyntaxKind.SpreadElementExpression) {
68076808
// Given the following situation:
@@ -6821,23 +6822,21 @@ namespace ts {
68216822
(languageVersion >= ScriptTarget.ES6 ? getElementTypeOfIterable(restArrayType, /*errorNode*/ undefined) : undefined);
68226823
if (restElementType) {
68236824
elementTypes.push(restElementType);
6824-
typeFlags |= restElementType.flags;
68256825
}
68266826
}
68276827
else {
68286828
let type = checkExpression(e, contextualMapper);
68296829
elementTypes.push(type);
6830-
typeFlags |= type.flags;
68316830
}
68326831
hasSpreadElement = hasSpreadElement || e.kind === SyntaxKind.SpreadElementExpression;
68336832
}
68346833
if (!hasSpreadElement) {
68356834
let contextualType = getContextualType(node);
68366835
if (contextualType && contextualTypeIsTupleLikeType(contextualType) || inDestructuringPattern) {
6837-
return addTypeFlags(createTupleType(elementTypes), typeFlags & TypeFlags.RequiresWidening);
6836+
return createTupleType(elementTypes);
68386837
}
68396838
}
6840-
return addTypeFlags(createArrayType(getUnionType(elementTypes)), typeFlags & TypeFlags.RequiresWidening);
6839+
return createArrayType(getUnionType(elementTypes));
68416840
}
68426841

68436842
function isNumericName(name: DeclarationName): boolean {
@@ -6953,7 +6952,8 @@ namespace ts {
69536952
let stringIndexType = getIndexType(IndexKind.String);
69546953
let numberIndexType = getIndexType(IndexKind.Number);
69556954
let result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexType, numberIndexType);
6956-
return addTypeFlags(result, TypeFlags.ObjectLiteral | TypeFlags.ContainsObjectLiteral | (typeFlags & TypeFlags.ContainsUndefinedOrNull));
6955+
result.flags |= TypeFlags.ObjectLiteral | TypeFlags.ContainsObjectLiteral | (typeFlags & TypeFlags.ContainsUndefinedOrNull);
6956+
return result;
69576957

69586958
function getIndexType(kind: IndexKind) {
69596959
if (contextualType && contextualTypeHasIndexSignature(contextualType, kind)) {
@@ -6979,11 +6979,6 @@ namespace ts {
69796979
}
69806980
}
69816981

6982-
function addTypeFlags(type: Type, flags: TypeFlags): Type {
6983-
type.flags |= flags;
6984-
return type;
6985-
}
6986-
69876982
function checkJsxSelfClosingElement(node: JsxSelfClosingElement) {
69886983
checkJsxOpeningLikeElement(node);
69896984
return jsxElementType || anyType;

src/compiler/diagnosticInformationMap.generated.ts

-1
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,6 @@ namespace ts {
589589
Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: { code: 7024, category: DiagnosticCategory.Error, key: "Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions." },
590590
Generator_implicitly_has_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_return_type: { code: 7025, category: DiagnosticCategory.Error, key: "Generator implicitly has type '{0}' because it does not yield any values. Consider supplying a return type." },
591591
JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists: { code: 7026, category: DiagnosticCategory.Error, key: "JSX element implicitly has type 'any' because no interface 'JSX.{0}' exists" },
592-
Array_element_at_index_0_implicitly_has_an_1_type: { code: 7027, category: DiagnosticCategory.Error, key: "Array element at index {0} implicitly has an '{1}' type." },
593592
You_cannot_rename_this_element: { code: 8000, category: DiagnosticCategory.Error, key: "You cannot rename this element." },
594593
You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library: { code: 8001, category: DiagnosticCategory.Error, key: "You cannot rename elements that are defined in the standard TypeScript library." },
595594
import_can_only_be_used_in_a_ts_file: { code: 8002, category: DiagnosticCategory.Error, key: "'import ... =' can only be used in a .ts file." },

src/compiler/diagnosticMessages.json

-8
Original file line numberDiff line numberDiff line change
@@ -2347,14 +2347,6 @@
23472347
"category": "Error",
23482348
"code": 7026
23492349
},
2350-
"JSX element implicitly has type 'any' because no interface 'JSX.{0}' exists": {
2351-
"category": "Error",
2352-
"code": 7026
2353-
},
2354-
"Array element at index {0} implicitly has an '{1}' type.": {
2355-
"category": "Error",
2356-
"code": 7027
2357-
},
23582350

23592351

23602352
"You cannot rename this element.": {

0 commit comments

Comments
 (0)