Skip to content

Commit 1f77317

Browse files
add strictTuples flag giving tuples known length
1 parent d03d107 commit 1f77317

File tree

27 files changed

+185
-69
lines changed

27 files changed

+185
-69
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ namespace ts {
6464
const noUnusedIdentifiers = !!compilerOptions.noUnusedLocals || !!compilerOptions.noUnusedParameters;
6565
const allowSyntheticDefaultImports = typeof compilerOptions.allowSyntheticDefaultImports !== "undefined" ? compilerOptions.allowSyntheticDefaultImports : modulekind === ModuleKind.System;
6666
const strictNullChecks = compilerOptions.strictNullChecks === undefined ? compilerOptions.strict : compilerOptions.strictNullChecks;
67+
const strictTuples = compilerOptions.strictTuples === undefined ? compilerOptions.strict : compilerOptions.strictTuples;
6768
const noImplicitAny = compilerOptions.noImplicitAny === undefined ? compilerOptions.strict : compilerOptions.noImplicitAny;
6869
const noImplicitThis = compilerOptions.noImplicitThis === undefined ? compilerOptions.strict : compilerOptions.noImplicitThis;
6970

@@ -7161,6 +7162,12 @@ namespace ts {
71617162
property.type = typeParameter;
71627163
properties.push(property);
71637164
}
7165+
if (strictTuples) {
7166+
const lengthSymbol = createSymbol(SymbolFlags.Property, "length" as __String);
7167+
lengthSymbol.type = getLiteralType(arity);
7168+
lengthSymbol.checkFlags = CheckFlags.Readonly;
7169+
properties.push(lengthSymbol);
7170+
}
71647171
const type = <GenericType & InterfaceTypeWithDeclaredMembers>createObjectType(ObjectFlags.Tuple | ObjectFlags.Reference);
71657172
type.typeParameters = typeParameters;
71667173
type.outerTypeParameters = undefined;

src/compiler/commandLineParser.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,13 @@ namespace ts {
269269
category: Diagnostics.Strict_Type_Checking_Options,
270270
description: Diagnostics.Enable_strict_null_checks
271271
},
272+
{
273+
name: "strictTuples",
274+
type: "boolean",
275+
showInSimplifiedHelpView: true,
276+
category: Diagnostics.Strict_Type_Checking_Options,
277+
description: Diagnostics.Enable_strict_tuple_checks
278+
},
272279
{
273280
name: "noImplicitThis",
274281
type: "boolean",

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3302,6 +3302,10 @@
33023302
"category": "Message",
33033303
"code": 6185
33043304
},
3305+
"Enable strict tuple checks.": {
3306+
"category": "Message",
3307+
"code": 6187
3308+
},
33053309
"Variable '{0}' implicitly has an '{1}' type.": {
33063310
"category": "Error",
33073311
"code": 7005

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3622,6 +3622,7 @@ namespace ts {
36223622
sourceRoot?: string;
36233623
strict?: boolean;
36243624
strictNullChecks?: boolean; // Always combine with strict property
3625+
strictTuples?: boolean;
36253626
/* @internal */ stripInternal?: boolean;
36263627
suppressExcessPropertyErrors?: boolean;
36273628
suppressImplicitAnyIndexErrors?: boolean;

src/harness/unittests/configurationExtension.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ namespace ts {
1616
strictNullChecks: false
1717
}
1818
},
19+
"/dev/tsconfig.strictTuples.json": {
20+
extends: "./tsconfig",
21+
compilerOptions: {
22+
strictTuples: false
23+
}
24+
},
1925
"/dev/configs/base.json": {
2026
compilerOptions: {
2127
allowJs: true,

src/harness/unittests/transpile.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,10 @@ var x = 0;`, {
413413
options: { compilerOptions: { strictNullChecks: true }, fileName: "input.js", reportDiagnostics: true }
414414
});
415415

416+
transpilesCorrectly("Supports setting 'strictTuples'", "x;", {
417+
options: { compilerOptions: { strictTuples: true }, fileName: "input.js", reportDiagnostics: true }
418+
});
419+
416420
transpilesCorrectly("Supports setting 'stripInternal'", "x;", {
417421
options: { compilerOptions: { stripInternal: true }, fileName: "input.js", reportDiagnostics: true }
418422
});

src/server/protocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2448,6 +2448,7 @@ namespace ts.server.protocol {
24482448
sourceRoot?: string;
24492449
strict?: boolean;
24502450
strictNullChecks?: boolean;
2451+
strictTuples?: boolean;
24512452
suppressExcessPropertyErrors?: boolean;
24522453
suppressImplicitAnyIndexErrors?: boolean;
24532454
target?: ScriptTarget | ts.ScriptTarget;

tests/baselines/reference/genericTypeAliases.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ type Strange<T> = string; // Type parameter not used
4040
var s: Strange<number>;
4141
s = "hello";
4242

43-
interface Tuple<A, B> {
43+
interface AB<A, B> {
4444
a: A;
4545
b: B;
4646
}
4747

48-
type Pair<T> = Tuple<T, T>;
48+
type Pair<T> = AB<T, T>;
4949

5050
interface TaggedPair<T> extends Pair<T> {
5151
tag: string;

tests/baselines/reference/genericTypeAliases.symbols

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -124,29 +124,29 @@ var s: Strange<number>;
124124
s = "hello";
125125
>s : Symbol(s, Decl(genericTypeAliases.ts, 38, 3))
126126

127-
interface Tuple<A, B> {
128-
>Tuple : Symbol(Tuple, Decl(genericTypeAliases.ts, 39, 12))
129-
>A : Symbol(A, Decl(genericTypeAliases.ts, 41, 16))
130-
>B : Symbol(B, Decl(genericTypeAliases.ts, 41, 18))
127+
interface AB<A, B> {
128+
>AB : Symbol(AB, Decl(genericTypeAliases.ts, 39, 12))
129+
>A : Symbol(A, Decl(genericTypeAliases.ts, 41, 13))
130+
>B : Symbol(B, Decl(genericTypeAliases.ts, 41, 15))
131131

132132
a: A;
133-
>a : Symbol(Tuple.a, Decl(genericTypeAliases.ts, 41, 23))
134-
>A : Symbol(A, Decl(genericTypeAliases.ts, 41, 16))
133+
>a : Symbol(AB.a, Decl(genericTypeAliases.ts, 41, 20))
134+
>A : Symbol(A, Decl(genericTypeAliases.ts, 41, 13))
135135

136136
b: B;
137-
>b : Symbol(Tuple.b, Decl(genericTypeAliases.ts, 42, 9))
138-
>B : Symbol(B, Decl(genericTypeAliases.ts, 41, 18))
137+
>b : Symbol(AB.b, Decl(genericTypeAliases.ts, 42, 9))
138+
>B : Symbol(B, Decl(genericTypeAliases.ts, 41, 15))
139139
}
140140

141-
type Pair<T> = Tuple<T, T>;
141+
type Pair<T> = AB<T, T>;
142142
>Pair : Symbol(Pair, Decl(genericTypeAliases.ts, 44, 1))
143143
>T : Symbol(T, Decl(genericTypeAliases.ts, 46, 10))
144-
>Tuple : Symbol(Tuple, Decl(genericTypeAliases.ts, 39, 12))
144+
>AB : Symbol(AB, Decl(genericTypeAliases.ts, 39, 12))
145145
>T : Symbol(T, Decl(genericTypeAliases.ts, 46, 10))
146146
>T : Symbol(T, Decl(genericTypeAliases.ts, 46, 10))
147147

148148
interface TaggedPair<T> extends Pair<T> {
149-
>TaggedPair : Symbol(TaggedPair, Decl(genericTypeAliases.ts, 46, 27))
149+
>TaggedPair : Symbol(TaggedPair, Decl(genericTypeAliases.ts, 46, 24))
150150
>T : Symbol(T, Decl(genericTypeAliases.ts, 48, 21))
151151
>Pair : Symbol(Pair, Decl(genericTypeAliases.ts, 44, 1))
152152
>T : Symbol(T, Decl(genericTypeAliases.ts, 48, 21))
@@ -157,17 +157,17 @@ interface TaggedPair<T> extends Pair<T> {
157157

158158
var p: TaggedPair<number>;
159159
>p : Symbol(p, Decl(genericTypeAliases.ts, 52, 3))
160-
>TaggedPair : Symbol(TaggedPair, Decl(genericTypeAliases.ts, 46, 27))
160+
>TaggedPair : Symbol(TaggedPair, Decl(genericTypeAliases.ts, 46, 24))
161161

162162
p.a = 1;
163-
>p.a : Symbol(Tuple.a, Decl(genericTypeAliases.ts, 41, 23))
163+
>p.a : Symbol(AB.a, Decl(genericTypeAliases.ts, 41, 20))
164164
>p : Symbol(p, Decl(genericTypeAliases.ts, 52, 3))
165-
>a : Symbol(Tuple.a, Decl(genericTypeAliases.ts, 41, 23))
165+
>a : Symbol(AB.a, Decl(genericTypeAliases.ts, 41, 20))
166166

167167
p.b = 2;
168-
>p.b : Symbol(Tuple.b, Decl(genericTypeAliases.ts, 42, 9))
168+
>p.b : Symbol(AB.b, Decl(genericTypeAliases.ts, 42, 9))
169169
>p : Symbol(p, Decl(genericTypeAliases.ts, 52, 3))
170-
>b : Symbol(Tuple.b, Decl(genericTypeAliases.ts, 42, 9))
170+
>b : Symbol(AB.b, Decl(genericTypeAliases.ts, 42, 9))
171171

172172
p.tag = "test";
173173
>p.tag : Symbol(TaggedPair.tag, Decl(genericTypeAliases.ts, 48, 41))

tests/baselines/reference/genericTypeAliases.types

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ s = "hello";
158158
>s : string
159159
>"hello" : "hello"
160160

161-
interface Tuple<A, B> {
162-
>Tuple : Tuple<A, B>
161+
interface AB<A, B> {
162+
>AB : AB<A, B>
163163
>A : A
164164
>B : B
165165

@@ -172,17 +172,17 @@ interface Tuple<A, B> {
172172
>B : B
173173
}
174174

175-
type Pair<T> = Tuple<T, T>;
176-
>Pair : Tuple<T, T>
175+
type Pair<T> = AB<T, T>;
176+
>Pair : AB<T, T>
177177
>T : T
178-
>Tuple : Tuple<A, B>
178+
>AB : AB<A, B>
179179
>T : T
180180
>T : T
181181

182182
interface TaggedPair<T> extends Pair<T> {
183183
>TaggedPair : TaggedPair<T>
184184
>T : T
185-
>Pair : Tuple<T, T>
185+
>Pair : AB<T, T>
186186
>T : T
187187

188188
tag: string;

0 commit comments

Comments
 (0)