Skip to content

Commit 2c47d31

Browse files
committed
Remove grammar restriction and add tests
1 parent 4174ab9 commit 2c47d31

File tree

54 files changed

+3267
-482
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+3267
-482
lines changed

src/compiler/checker.ts

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ namespace ts {
3030
(preserveConstEnums && moduleState === ModuleInstanceState.ConstEnumOnly);
3131
}
3232

33+
function getIndexSignatureParameterErrorChain() {
34+
return chainDiagnosticMessages(
35+
/*details*/ undefined,
36+
Diagnostics.An_index_signature_parameter_type_must_be_assignable_to_string_number_symbol
37+
);
38+
}
39+
3340
export function createTypeChecker(host: TypeCheckerHost, produceDiagnostics: boolean): TypeChecker {
3441
const getPackagesSet: () => Map<true> = memoize(() => {
3542
const set = createMap<true>();
@@ -9444,6 +9451,10 @@ namespace ts {
94449451
if (isGenericMappedType(objectType)) {
94459452
return type.simplified = substituteIndexedMappedType(objectType, type);
94469453
}
9454+
const indexedType = getResultingTypeOfIndexOnType(objectType, indexType);
9455+
if (indexedType) {
9456+
return type.simplified = getSimplifiedType(indexedType);
9457+
}
94479458
if (objectType.flags & TypeFlags.TypeParameter) {
94489459
const constraint = getConstraintOfTypeParameter(objectType as TypeParameter);
94499460
if (constraint && isGenericMappedType(constraint)) {
@@ -11081,7 +11092,7 @@ namespace ts {
1108111092
if (s & TypeFlags.Null && (!strictNullChecks || t & TypeFlags.Null)) return true;
1108211093
if (s & TypeFlags.Object && t & TypeFlags.NonPrimitive) return true;
1108311094
if (s & TypeFlags.UniqueESSymbol || t & TypeFlags.UniqueESSymbol) return false;
11084-
if (relation === assignableRelation || relation === definitelyAssignableRelation || relation === comparableRelation || relation === indexAssignableRelation || relation === indexAccessAssignableRelation) {
11095+
if (relation === assignableRelation || relation === definitelyAssignableRelation || relation === comparableRelation) {
1108511096
if (s & TypeFlags.Any) return true;
1108611097
// Type number or any numeric literal type is assignable to any numeric enum type or any
1108711098
// numeric enum literal type. This rule exists for backwards compatibility reasons because
@@ -11090,10 +11101,12 @@ namespace ts {
1109011101
t & TypeFlags.Enum || t & TypeFlags.NumberLiteral && t & TypeFlags.EnumLiteral)) return true;
1109111102
}
1109211103
if (relation === indexAccessAssignableRelation) {
11104+
if (s & TypeFlags.Any) return true;
1109311105
if (s & TypeFlags.NumberLike && t & TypeFlags.String) return true;
1109411106
if (s & TypeFlags.NumberLiteral && t & TypeFlags.StringLiteral) return (source as LiteralType).value === +(target as LiteralType).value;
1109511107
}
1109611108
if (relation === indexAssignableRelation) {
11109+
if (s & TypeFlags.Any) return true;
1109711110
if (s & TypeFlags.String && t & TypeFlags.Number) return true;
1109811111
if (s & TypeFlags.StringLiteral && t & TypeFlags.NumberLiteral) return +(source as LiteralType).value === (target as LiteralType).value;
1109911112
}
@@ -18938,7 +18951,7 @@ namespace ts {
1893818951

1893918952
function getArrayifiedType(type: Type) {
1894018953
if (forEachType(type, t => !(t.flags & (TypeFlags.Any | TypeFlags.Instantiable) || isArrayType(t) || isTupleType(t)))) {
18941-
return createArrayType(getIndexTypeOfType(type, IndexKind.Number) || errorType);
18954+
return createArrayType(getResultingTypeOfIndexOnType(type, numberType) || errorType);
1894218955
}
1894318956
return type;
1894418957
}
@@ -29011,23 +29024,8 @@ namespace ts {
2901129024
if (!parameter.type) {
2901229025
return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_must_have_a_type_annotation);
2901329026
}
29014-
if (parameter.type.kind !== SyntaxKind.StringKeyword && parameter.type.kind !== SyntaxKind.NumberKeyword) {
29015-
const type = getTypeFromTypeNode(parameter.type);
29016-
29017-
if (type.flags & TypeFlags.String || type.flags & TypeFlags.Number) {
29018-
return grammarErrorOnNode(parameter.name,
29019-
Diagnostics.An_index_signature_parameter_type_cannot_be_a_type_alias_Consider_writing_0_Colon_1_Colon_2_instead,
29020-
getTextOfNode(parameter.name),
29021-
typeToString(type),
29022-
typeToString(getTypeFromTypeNode(node.type!)));
29023-
}
29024-
29025-
if (type.flags & TypeFlags.Union && allTypesAssignableToKind(type, TypeFlags.StringLiteral, /*strict*/ true)) {
29026-
return grammarErrorOnNode(parameter.name,
29027-
Diagnostics.An_index_signature_parameter_type_cannot_be_a_union_type_Consider_using_a_mapped_object_type_instead);
29028-
}
29029-
29030-
return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_parameter_type_must_be_string_or_number);
29027+
else {
29028+
checkTypeAssignableTo(getTypeFromTypeNode(parameter.type), stringNumberSymbolType, parameter.name, /*headMessage*/ undefined, getIndexSignatureParameterErrorChain);
2903129029
}
2903229030
if (!node.type) {
2903329031
return grammarErrorOnNode(node, Diagnostics.An_index_signature_must_have_a_type_annotation);

src/compiler/diagnosticMessages.json

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
"category": "Error",
7272
"code": 1022
7373
},
74-
"An index signature parameter type must be 'string' or 'number'.": {
74+
"An index signature parameter type must be assignable to 'string | number | symbol'.": {
7575
"category": "Error",
7676
"code": 1023
7777
},
@@ -955,14 +955,6 @@
955955
"category": "Error",
956956
"code": 1335
957957
},
958-
"An index signature parameter type cannot be a type alias. Consider writing '[{0}: {1}]: {2}' instead.": {
959-
"category": "Error",
960-
"code": 1336
961-
},
962-
"An index signature parameter type cannot be a union type. Consider using a mapped object type instead.": {
963-
"category": "Error",
964-
"code": 1337
965-
},
966958
"'infer' declarations are only permitted in the 'extends' clause of a conditional type.": {
967959
"category": "Error",
968960
"code": 1338

src/services/codefixes/convertToMappedObjectType.ts

Lines changed: 0 additions & 56 deletions
This file was deleted.

src/services/tsconfig.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@
7272
"codefixes/requireInTs.ts",
7373
"codefixes/useDefaultImport.ts",
7474
"codefixes/fixAddModuleReferTypeMissingTypeof.ts",
75-
"codefixes/convertToMappedObjectType.ts",
7675
"refactors/convertExport.ts",
7776
"refactors/convertImport.ts",
7877
"refactors/extractSymbol.ts",

tests/baselines/reference/arraySigChecking.errors.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
tests/cases/compiler/arraySigChecking.ts(11,17): error TS1023: An index signature parameter type must be 'string' or 'number'.
1+
tests/cases/compiler/arraySigChecking.ts(11,16): error TS1021: An index signature must have a type annotation.
22
tests/cases/compiler/arraySigChecking.ts(18,5): error TS2322: Type 'void[]' is not assignable to type 'string[]'.
33
Type 'void' is not assignable to type 'string'.
44
tests/cases/compiler/arraySigChecking.ts(22,1): error TS2322: Type 'number[][]' is not assignable to type 'number[][][]'.
@@ -18,8 +18,8 @@ tests/cases/compiler/arraySigChecking.ts(22,1): error TS2322: Type 'number[][]'
1818
}
1919

2020
var foo: { [index: any]; }; // expect an error here
21-
~~~~~
22-
!!! error TS1023: An index signature parameter type must be 'string' or 'number'.
21+
~~~~~~~~~~~~~
22+
!!! error TS1021: An index signature must have a type annotation.
2323
}
2424

2525
interface myInt {

tests/baselines/reference/declarationEmitIndexTypeNotFound.errors.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
tests/cases/compiler/declarationEmitIndexTypeNotFound.ts(2,6): error TS1023: An index signature parameter type must be 'string' or 'number'.
21
tests/cases/compiler/declarationEmitIndexTypeNotFound.ts(2,13): error TS2304: Cannot find name 'TypeNotFound'.
32
tests/cases/compiler/declarationEmitIndexTypeNotFound.ts(2,13): error TS4092: Parameter 'index' of index signature from exported interface has or is using private name 'TypeNotFound'.
43

54

6-
==== tests/cases/compiler/declarationEmitIndexTypeNotFound.ts (3 errors) ====
5+
==== tests/cases/compiler/declarationEmitIndexTypeNotFound.ts (2 errors) ====
76
export interface Test {
87
[index: TypeNotFound]: any;
9-
~~~~~
10-
!!! error TS1023: An index signature parameter type must be 'string' or 'number'.
118
~~~~~~~~~~~~
129
!!! error TS2304: Cannot find name 'TypeNotFound'.
1310
~~~~~~~~~~~~

tests/baselines/reference/genericIndexTypeHasSensibleErrorMessage.errors.txt

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.d.errors.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc
22
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(10,21): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
33
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(11,22): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
44
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(11,26): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
5-
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,19): error TS1023: An index signature parameter type must be 'string' or 'number'.
65
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,22): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
76
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(12,26): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
87
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(14,23): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
@@ -14,7 +13,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc
1413
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts(26,30): error TS2314: Generic type 'E<T>' requires 1 type argument(s).
1514

1615

17-
==== tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts (14 errors) ====
16+
==== tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.d.ts (13 errors) ====
1817
// it is an error to use a generic type without type arguments
1918
// all of these are errors
2019

@@ -35,8 +34,6 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc
3534
~
3635
!!! error TS2314: Generic type 'C<T>' requires 1 type argument(s).
3736
declare var d: { [x: C]: C };
38-
~
39-
!!! error TS1023: An index signature parameter type must be 'string' or 'number'.
4037
~
4138
!!! error TS2314: Generic type 'C<T>' requires 1 type argument(s).
4239
~

tests/baselines/reference/genericTypeReferenceWithoutTypeArgument.errors.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc
22
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(10,13): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
33
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(11,14): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
44
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(11,18): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
5-
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,11): error TS1023: An index signature parameter type must be 'string' or 'number'.
65
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,14): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
76
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(12,18): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
87
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(14,13): error TS2314: Generic type 'C<T>' requires 1 type argument(s).
@@ -24,7 +23,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc
2423
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts(37,10): error TS2314: Generic type 'E<T>' requires 1 type argument(s).
2524

2625

27-
==== tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts (24 errors) ====
26+
==== tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument.ts (23 errors) ====
2827
// it is an error to use a generic type without type arguments
2928
// all of these are errors
3029

@@ -45,8 +44,6 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc
4544
~
4645
!!! error TS2314: Generic type 'C<T>' requires 1 type argument(s).
4746
var d: { [x: C]: C };
48-
~
49-
!!! error TS1023: An index signature parameter type must be 'string' or 'number'.
5047
~
5148
!!! error TS2314: Generic type 'C<T>' requires 1 type argument(s).
5249
~

tests/baselines/reference/genericTypeReferenceWithoutTypeArgument2.errors.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc
22
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(10,13): error TS2314: Generic type 'I<T>' requires 1 type argument(s).
33
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(11,14): error TS2314: Generic type 'I<T>' requires 1 type argument(s).
44
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(11,18): error TS2314: Generic type 'I<T>' requires 1 type argument(s).
5-
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,11): error TS1023: An index signature parameter type must be 'string' or 'number'.
65
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,14): error TS2314: Generic type 'I<T>' requires 1 type argument(s).
76
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(12,18): error TS2314: Generic type 'I<T>' requires 1 type argument(s).
87
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(14,13): error TS2314: Generic type 'I<T>' requires 1 type argument(s).
@@ -24,7 +23,7 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc
2423
tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts(37,10): error TS2314: Generic type 'E<T>' requires 1 type argument(s).
2524

2625

27-
==== tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts (24 errors) ====
26+
==== tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenceWithoutTypeArgument2.ts (23 errors) ====
2827
// it is an error to use a generic type without type arguments
2928
// all of these are errors
3029

@@ -45,8 +44,6 @@ tests/cases/conformance/types/specifyingTypes/typeReferences/genericTypeReferenc
4544
~
4645
!!! error TS2314: Generic type 'I<T>' requires 1 type argument(s).
4746
var d: { [x: I]: I };
48-
~
49-
!!! error TS1023: An index signature parameter type must be 'string' or 'number'.
5047
~
5148
!!! error TS2314: Generic type 'I<T>' requires 1 type argument(s).
5249
~

0 commit comments

Comments
 (0)