diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 903287707503c..e4fa10065433c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2640,17 +2640,8 @@ namespace ts { return createArrayTypeNode(elementType); } else if (type.target.objectFlags & ObjectFlags.Tuple) { - if (typeArguments.length > 0) { - const tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, getTypeReferenceArity(type)), context); - if (tupleConstituentNodes && tupleConstituentNodes.length > 0) { - return createTupleTypeNode(tupleConstituentNodes); - } - } - if (context.encounteredError || (context.flags & NodeBuilderFlags.AllowEmptyTuple)) { - return createTupleTypeNode([]); - } - context.encounteredError = true; - return undefined; + const tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, getTypeReferenceArity(type)), context); + return createTupleTypeNode(tupleConstituentNodes); } else { const outerTypeParameters = type.target.outerTypeParameters; @@ -9991,7 +9982,7 @@ namespace ts { } function isTupleLikeType(type: Type): boolean { - return !!getPropertyOfType(type, "0" as __String); + return !!getPropertyOfType(type, "0" as __String) || type === getTupleTypeOfArity(0); } function isUnitType(type: Type): boolean { @@ -13376,9 +13367,7 @@ namespace ts { } } } - if (elementTypes.length) { - return createTupleType(elementTypes); - } + return createTupleType(elementTypes); } } return createArrayType(elementTypes.length ? @@ -18736,11 +18725,7 @@ namespace ts { function checkTupleType(node: TupleTypeNode) { // Grammar checking - const hasErrorFromDisallowedTrailingComma = checkGrammarForDisallowedTrailingComma(node.elementTypes); - if (!hasErrorFromDisallowedTrailingComma && node.elementTypes.length === 0) { - grammarErrorOnNode(node, Diagnostics.A_tuple_type_element_list_cannot_be_empty); - } - + checkGrammarForDisallowedTrailingComma(node.elementTypes); forEach(node.elementTypes, checkSourceElement); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 0a09bb5b6ecba..8682dec579c8a 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -2651,9 +2651,9 @@ namespace ts { AllowQualifedNameInPlaceOfIdentifier = 1 << 11, AllowAnonymousIdentifier = 1 << 13, AllowEmptyUnionOrIntersection = 1 << 14, - AllowEmptyTuple = 1 << 15, + // AllowEmptyTuple = 1 << 15, - IgnoreErrors = AllowThisInObjectLiteral | AllowQualifedNameInPlaceOfIdentifier | AllowAnonymousIdentifier | AllowEmptyUnionOrIntersection | AllowEmptyTuple, + IgnoreErrors = AllowThisInObjectLiteral | AllowQualifedNameInPlaceOfIdentifier | AllowAnonymousIdentifier | AllowEmptyUnionOrIntersection, // State InObjectTypeLiteral = 1 << 20, diff --git a/tests/baselines/reference/TupleType3.errors.txt b/tests/baselines/reference/TupleType3.errors.txt deleted file mode 100644 index a7f5b1173257d..0000000000000 --- a/tests/baselines/reference/TupleType3.errors.txt +++ /dev/null @@ -1,7 +0,0 @@ -tests/cases/conformance/parser/ecmascript5/TupleTypes/TupleType3.ts(1,8): error TS1122: A tuple type element list cannot be empty. - - -==== tests/cases/conformance/parser/ecmascript5/TupleTypes/TupleType3.ts (1 errors) ==== - var v: [] - ~~ -!!! error TS1122: A tuple type element list cannot be empty. \ No newline at end of file diff --git a/tests/baselines/reference/TupleType3.symbols b/tests/baselines/reference/TupleType3.symbols new file mode 100644 index 0000000000000..a2466e8512103 --- /dev/null +++ b/tests/baselines/reference/TupleType3.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/parser/ecmascript5/TupleTypes/TupleType3.ts === +var v: [] +>v : Symbol(v, Decl(TupleType3.ts, 0, 3)) + diff --git a/tests/baselines/reference/TupleType3.types b/tests/baselines/reference/TupleType3.types new file mode 100644 index 0000000000000..5944aabd7d417 --- /dev/null +++ b/tests/baselines/reference/TupleType3.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/parser/ecmascript5/TupleTypes/TupleType3.ts === +var v: [] +>v : [] + diff --git a/tests/baselines/reference/anyIndexedAccessArrayNoException.errors.txt b/tests/baselines/reference/anyIndexedAccessArrayNoException.errors.txt index 01c5bd6b2e2c0..e207468122bc0 100644 --- a/tests/baselines/reference/anyIndexedAccessArrayNoException.errors.txt +++ b/tests/baselines/reference/anyIndexedAccessArrayNoException.errors.txt @@ -1,11 +1,8 @@ -tests/cases/compiler/anyIndexedAccessArrayNoException.ts(1,12): error TS1122: A tuple type element list cannot be empty. tests/cases/compiler/anyIndexedAccessArrayNoException.ts(1,12): error TS2538: Type '[]' cannot be used as an index type. -==== tests/cases/compiler/anyIndexedAccessArrayNoException.ts (2 errors) ==== +==== tests/cases/compiler/anyIndexedAccessArrayNoException.ts (1 errors) ==== var x: any[[]]; ~~ -!!! error TS1122: A tuple type element list cannot be empty. - ~~ !!! error TS2538: Type '[]' cannot be used as an index type. \ No newline at end of file diff --git a/tests/baselines/reference/arrayLiterals3.errors.txt b/tests/baselines/reference/arrayLiterals3.errors.txt index 3ebf4174f51bd..bc8ed577026ea 100644 --- a/tests/baselines/reference/arrayLiterals3.errors.txt +++ b/tests/baselines/reference/arrayLiterals3.errors.txt @@ -1,5 +1,5 @@ -tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(10,5): error TS2322: Type 'undefined[]' is not assignable to type '[any, any, any]'. - Property '0' is missing in type 'undefined[]'. +tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(10,5): error TS2322: Type '[]' is not assignable to type '[any, any, any]'. + Property '0' is missing in type '[]'. tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(11,5): error TS2322: Type '["string", number, boolean]' is not assignable to type '[boolean, string, number]'. Type '"string"' is not assignable to type 'boolean'. tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(17,5): error TS2322: Type '[number, number, string, boolean]' is not assignable to type '[number, number]'. @@ -32,8 +32,8 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error var a0: [any, any, any] = []; // Error ~~ -!!! error TS2322: Type 'undefined[]' is not assignable to type '[any, any, any]'. -!!! error TS2322: Property '0' is missing in type 'undefined[]'. +!!! error TS2322: Type '[]' is not assignable to type '[any, any, any]'. +!!! error TS2322: Property '0' is missing in type '[]'. var a1: [boolean, string, number] = ["string", 1, true]; // Error ~~ !!! error TS2322: Type '["string", number, boolean]' is not assignable to type '[boolean, string, number]'. diff --git a/tests/baselines/reference/emptyTuplesTypeAssertion01.errors.txt b/tests/baselines/reference/emptyTuplesTypeAssertion01.errors.txt deleted file mode 100644 index bfe850a5749bf..0000000000000 --- a/tests/baselines/reference/emptyTuplesTypeAssertion01.errors.txt +++ /dev/null @@ -1,8 +0,0 @@ -tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion01.ts(1,10): error TS1122: A tuple type element list cannot be empty. - - -==== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion01.ts (1 errors) ==== - let x = <[]>[]; - ~~ -!!! error TS1122: A tuple type element list cannot be empty. - let y = x[0]; \ No newline at end of file diff --git a/tests/baselines/reference/emptyTuplesTypeAssertion01.symbols b/tests/baselines/reference/emptyTuplesTypeAssertion01.symbols new file mode 100644 index 0000000000000..e874379252bf3 --- /dev/null +++ b/tests/baselines/reference/emptyTuplesTypeAssertion01.symbols @@ -0,0 +1,8 @@ +=== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion01.ts === +let x = <[]>[]; +>x : Symbol(x, Decl(emptyTuplesTypeAssertion01.ts, 0, 3)) + +let y = x[0]; +>y : Symbol(y, Decl(emptyTuplesTypeAssertion01.ts, 1, 3)) +>x : Symbol(x, Decl(emptyTuplesTypeAssertion01.ts, 0, 3)) + diff --git a/tests/baselines/reference/emptyTuplesTypeAssertion01.types b/tests/baselines/reference/emptyTuplesTypeAssertion01.types new file mode 100644 index 0000000000000..0a278c01d3169 --- /dev/null +++ b/tests/baselines/reference/emptyTuplesTypeAssertion01.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion01.ts === +let x = <[]>[]; +>x : [] +><[]>[] : [] +>[] : [] + +let y = x[0]; +>y : never +>x[0] : never +>x : [] +>0 : 0 + diff --git a/tests/baselines/reference/emptyTuplesTypeAssertion02.errors.txt b/tests/baselines/reference/emptyTuplesTypeAssertion02.errors.txt deleted file mode 100644 index 1bbf96e6aec70..0000000000000 --- a/tests/baselines/reference/emptyTuplesTypeAssertion02.errors.txt +++ /dev/null @@ -1,8 +0,0 @@ -tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion02.ts(1,15): error TS1122: A tuple type element list cannot be empty. - - -==== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion02.ts (1 errors) ==== - let x = [] as []; - ~~ -!!! error TS1122: A tuple type element list cannot be empty. - let y = x[0]; \ No newline at end of file diff --git a/tests/baselines/reference/emptyTuplesTypeAssertion02.symbols b/tests/baselines/reference/emptyTuplesTypeAssertion02.symbols new file mode 100644 index 0000000000000..091b96f7fa427 --- /dev/null +++ b/tests/baselines/reference/emptyTuplesTypeAssertion02.symbols @@ -0,0 +1,8 @@ +=== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion02.ts === +let x = [] as []; +>x : Symbol(x, Decl(emptyTuplesTypeAssertion02.ts, 0, 3)) + +let y = x[0]; +>y : Symbol(y, Decl(emptyTuplesTypeAssertion02.ts, 1, 3)) +>x : Symbol(x, Decl(emptyTuplesTypeAssertion02.ts, 0, 3)) + diff --git a/tests/baselines/reference/emptyTuplesTypeAssertion02.types b/tests/baselines/reference/emptyTuplesTypeAssertion02.types new file mode 100644 index 0000000000000..ef35e90eac2cb --- /dev/null +++ b/tests/baselines/reference/emptyTuplesTypeAssertion02.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion02.ts === +let x = [] as []; +>x : [] +>[] as [] : [] +>[] : [] + +let y = x[0]; +>y : never +>x[0] : never +>x : [] +>0 : 0 + diff --git a/tests/baselines/reference/keyofAndIndexedAccessErrors.errors.txt b/tests/baselines/reference/keyofAndIndexedAccessErrors.errors.txt index 0634c3419e014..1e88e2abc4341 100644 --- a/tests/baselines/reference/keyofAndIndexedAccessErrors.errors.txt +++ b/tests/baselines/reference/keyofAndIndexedAccessErrors.errors.txt @@ -15,7 +15,6 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(35,21): error tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(36,21): error TS2538: Type 'boolean' cannot be used as an index type. tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(41,31): error TS2538: Type 'boolean' cannot be used as an index type. tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(46,16): error TS2538: Type 'boolean' cannot be used as an index type. -tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(49,12): error TS1122: A tuple type element list cannot be empty. tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(63,33): error TS2345: Argument of type '"size"' is not assignable to parameter of type '"name" | "width" | "height" | "visible"'. tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(64,33): error TS2345: Argument of type '"name" | "size"' is not assignable to parameter of type '"name" | "width" | "height" | "visible"'. Type '"size"' is not assignable to type '"name" | "width" | "height" | "visible"'. @@ -29,7 +28,7 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(76,5): error tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(77,5): error TS2322: Type 'keyof (T & U)' is not assignable to type 'keyof (T | U)'. -==== tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts (25 errors) ==== +==== tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts (24 errors) ==== class Shape { name: string; width: number; @@ -113,8 +112,6 @@ tests/cases/conformance/types/keyof/keyofAndIndexedAccessErrors.ts(77,5): error type T60 = {}["toString"]; type T61 = []["toString"]; - ~~ -!!! error TS1122: A tuple type element list cannot be empty. declare let cond: boolean; diff --git a/tests/baselines/reference/promiseEmptyTupleNoException.errors.txt b/tests/baselines/reference/promiseEmptyTupleNoException.errors.txt index 0237d658da57a..9ba038d9b4c2c 100644 --- a/tests/baselines/reference/promiseEmptyTupleNoException.errors.txt +++ b/tests/baselines/reference/promiseEmptyTupleNoException.errors.txt @@ -1,14 +1,11 @@ -tests/cases/compiler/promiseEmptyTupleNoException.ts(1,38): error TS1122: A tuple type element list cannot be empty. tests/cases/compiler/promiseEmptyTupleNoException.ts(3,3): error TS2322: Type 'any[]' is not assignable to type '[]'. Types of property 'pop' are incompatible. Type '() => any' is not assignable to type '() => never'. Type 'any' is not assignable to type 'never'. -==== tests/cases/compiler/promiseEmptyTupleNoException.ts (2 errors) ==== +==== tests/cases/compiler/promiseEmptyTupleNoException.ts (1 errors) ==== export async function get(): Promise<[]> { - ~~ -!!! error TS1122: A tuple type element list cannot be empty. let emails = []; return emails; ~~~~~~~~~~~~~~ diff --git a/tests/baselines/reference/tupleTypes.errors.txt b/tests/baselines/reference/tupleTypes.errors.txt index 3b55476e4b1d5..1212fd5dd1ee9 100644 --- a/tests/baselines/reference/tupleTypes.errors.txt +++ b/tests/baselines/reference/tupleTypes.errors.txt @@ -1,34 +1,44 @@ -tests/cases/compiler/tupleTypes.ts(1,9): error TS1122: A tuple type element list cannot be empty. -tests/cases/compiler/tupleTypes.ts(14,1): error TS2322: Type 'undefined[]' is not assignable to type '[number, string]'. - Property '0' is missing in type 'undefined[]'. -tests/cases/compiler/tupleTypes.ts(15,1): error TS2322: Type '[number]' is not assignable to type '[number, string]'. +tests/cases/compiler/tupleTypes.ts(15,1): error TS2322: Type '[]' is not assignable to type '[number, string]'. + Property '0' is missing in type '[]'. +tests/cases/compiler/tupleTypes.ts(16,1): error TS2322: Type '[number]' is not assignable to type '[number, string]'. Property '1' is missing in type '[number]'. -tests/cases/compiler/tupleTypes.ts(17,1): error TS2322: Type '[string, number]' is not assignable to type '[number, string]'. +tests/cases/compiler/tupleTypes.ts(18,1): error TS2322: Type '[string, number]' is not assignable to type '[number, string]'. Type 'string' is not assignable to type 'number'. -tests/cases/compiler/tupleTypes.ts(41,1): error TS2322: Type 'undefined[]' is not assignable to type '[number, string]'. -tests/cases/compiler/tupleTypes.ts(47,1): error TS2322: Type '[number, string]' is not assignable to type 'number[]'. +tests/cases/compiler/tupleTypes.ts(25,1): error TS2322: Type '[number]' is not assignable to type '[]'. + Types of property 'pop' are incompatible. + Type '() => number' is not assignable to type '() => never'. + Type 'number' is not assignable to type 'never'. +tests/cases/compiler/tupleTypes.ts(48,1): error TS2322: Type '[]' is not assignable to type '[number, string]'. +tests/cases/compiler/tupleTypes.ts(55,1): error TS2322: Type '[number, string]' is not assignable to type 'number[]'. Types of property 'pop' are incompatible. Type '() => string | number' is not assignable to type '() => number'. Type 'string | number' is not assignable to type 'number'. Type 'string' is not assignable to type 'number'. -tests/cases/compiler/tupleTypes.ts(49,1): error TS2322: Type '[number, {}]' is not assignable to type 'number[]'. +tests/cases/compiler/tupleTypes.ts(57,1): error TS2322: Type '[number, {}]' is not assignable to type 'number[]'. Types of property 'pop' are incompatible. Type '() => number | {}' is not assignable to type '() => number'. Type 'number | {}' is not assignable to type 'number'. Type '{}' is not assignable to type 'number'. -tests/cases/compiler/tupleTypes.ts(50,1): error TS2322: Type '[number, number]' is not assignable to type '[number, string]'. +tests/cases/compiler/tupleTypes.ts(59,1): error TS2322: Type '[number, number]' is not assignable to type '[number, string]'. Type 'number' is not assignable to type 'string'. -tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is not assignable to type '[number, string]'. +tests/cases/compiler/tupleTypes.ts(60,1): error TS2322: Type '[number, {}]' is not assignable to type '[number, string]'. Type '{}' is not assignable to type 'string'. +tests/cases/compiler/tupleTypes.ts(61,1): error TS2322: Type '[]' is not assignable to type '[number, string]'. +tests/cases/compiler/tupleTypes.ts(64,1): error TS2322: Type '[]' is not assignable to type '[number, {}]'. + Property '0' is missing in type '[]'. +tests/cases/compiler/tupleTypes.ts(65,1): error TS2322: Type '[number, string]' is not assignable to type '[]'. + Types of property 'pop' are incompatible. + Type '() => string | number' is not assignable to type '() => never'. + Type 'string | number' is not assignable to type 'never'. + Type 'string' is not assignable to type 'never'. -==== tests/cases/compiler/tupleTypes.ts (9 errors) ==== - var v1: []; // Error - ~~ -!!! error TS1122: A tuple type element list cannot be empty. +==== tests/cases/compiler/tupleTypes.ts (12 errors) ==== + var v1: [] = []; var v2: [number]; var v3: [number, string]; var v4: [number, [string, string]]; + var v5: number[] = v1; var t: [number, string]; var t0 = t[0]; // number @@ -40,8 +50,8 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n t = []; // Error ~ -!!! error TS2322: Type 'undefined[]' is not assignable to type '[number, string]'. -!!! error TS2322: Property '0' is missing in type 'undefined[]'. +!!! error TS2322: Type '[]' is not assignable to type '[number, string]'. +!!! error TS2322: Property '0' is missing in type '[]'. t = [1]; // Error ~ !!! error TS2322: Type '[number]' is not assignable to type '[number, string]'. @@ -53,6 +63,17 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n !!! error TS2322: Type 'string' is not assignable to type 'number'. t = [1, "hello", 2]; // Ok + var et: []; + var et0 = et[0]; // never + var et0: never; + et = []; // Ok + et = [1]; // Error + ~~ +!!! error TS2322: Type '[number]' is not assignable to type '[]'. +!!! error TS2322: Types of property 'pop' are incompatible. +!!! error TS2322: Type '() => number' is not assignable to type '() => never'. +!!! error TS2322: Type 'number' is not assignable to type 'never'. + var tf: [string, (x: string) => number] = ["hello", x => x.length]; declare function ff(a: T, b: [T, (x: T) => U]): U; @@ -76,12 +97,13 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n tt = [undefined, undefined]; tt = []; // Error ~~ -!!! error TS2322: Type 'undefined[]' is not assignable to type '[number, string]'. +!!! error TS2322: Type '[]' is not assignable to type '[number, string]'. var a: number[]; var a1: [number, string]; var a2: [number, number]; var a3: [number, {}]; + var a4: []; a = a1; // Error ~ !!! error TS2322: Type '[number, string]' is not assignable to type 'number[]'. @@ -97,6 +119,7 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n !!! error TS2322: Type '() => number | {}' is not assignable to type '() => number'. !!! error TS2322: Type 'number | {}' is not assignable to type 'number'. !!! error TS2322: Type '{}' is not assignable to type 'number'. + a = a4; a1 = a2; // Error ~~ !!! error TS2322: Type '[number, number]' is not assignable to type '[number, string]'. @@ -105,6 +128,20 @@ tests/cases/compiler/tupleTypes.ts(51,1): error TS2322: Type '[number, {}]' is n ~~ !!! error TS2322: Type '[number, {}]' is not assignable to type '[number, string]'. !!! error TS2322: Type '{}' is not assignable to type 'string'. + a1 = a4; // Error + ~~ +!!! error TS2322: Type '[]' is not assignable to type '[number, string]'. a3 = a1; a3 = a2; + a3 = a4; // Error + ~~ +!!! error TS2322: Type '[]' is not assignable to type '[number, {}]'. +!!! error TS2322: Property '0' is missing in type '[]'. + a4 = a1; // Error + ~~ +!!! error TS2322: Type '[number, string]' is not assignable to type '[]'. +!!! error TS2322: Types of property 'pop' are incompatible. +!!! error TS2322: Type '() => string | number' is not assignable to type '() => never'. +!!! error TS2322: Type 'string | number' is not assignable to type 'never'. +!!! error TS2322: Type 'string' is not assignable to type 'never'. \ No newline at end of file diff --git a/tests/baselines/reference/tupleTypes.js b/tests/baselines/reference/tupleTypes.js index 451aeb5eb0925..763bf2085978d 100644 --- a/tests/baselines/reference/tupleTypes.js +++ b/tests/baselines/reference/tupleTypes.js @@ -1,8 +1,9 @@ //// [tupleTypes.ts] -var v1: []; // Error +var v1: [] = []; var v2: [number]; var v3: [number, string]; var v4: [number, [string, string]]; +var v5: number[] = v1; var t: [number, string]; var t0 = t[0]; // number @@ -18,6 +19,12 @@ t = [1, "hello"]; // Ok t = ["hello", 1]; // Error t = [1, "hello", 2]; // Ok +var et: []; +var et0 = et[0]; // never +var et0: never; +et = []; // Ok +et = [1]; // Error + var tf: [string, (x: string) => number] = ["hello", x => x.length]; declare function ff(a: T, b: [T, (x: T) => U]): U; @@ -45,20 +52,26 @@ var a: number[]; var a1: [number, string]; var a2: [number, number]; var a3: [number, {}]; +var a4: []; a = a1; // Error a = a2; a = a3; // Error +a = a4; a1 = a2; // Error a1 = a3; // Error +a1 = a4; // Error a3 = a1; a3 = a2; +a3 = a4; // Error +a4 = a1; // Error //// [tupleTypes.js] -var v1; // Error +var v1 = []; var v2; var v3; var v4; +var v5 = v1; var t; var t0 = t[0]; // number var t0; @@ -71,6 +84,11 @@ t = [1]; // Error t = [1, "hello"]; // Ok t = ["hello", 1]; // Error t = [1, "hello", 2]; // Ok +var et; +var et0 = et[0]; // never +var et0; +et = []; // Ok +et = [1]; // Error var tf = ["hello", function (x) { return x.length; }]; var ff1 = ff("hello", ["foo", function (x) { return x.length; }]); var ff1; @@ -92,10 +110,15 @@ var a; var a1; var a2; var a3; +var a4; a = a1; // Error a = a2; a = a3; // Error +a = a4; a1 = a2; // Error a1 = a3; // Error +a1 = a4; // Error a3 = a1; a3 = a2; +a3 = a4; // Error +a4 = a1; // Error diff --git a/tests/baselines/reference/tupleTypesStrictNullChecks.js b/tests/baselines/reference/tupleTypesStrictNullChecks.js new file mode 100644 index 0000000000000..ef8b9484b862a --- /dev/null +++ b/tests/baselines/reference/tupleTypesStrictNullChecks.js @@ -0,0 +1,13 @@ +//// [tupleTypesStrictNullChecks.ts] +var et: [] = []; +var et0 = et[0]; // never +var et0: never; + +et = []; // Ok + + +//// [tupleTypesStrictNullChecks.js] +var et = []; +var et0 = et[0]; // never +var et0; +et = []; // Ok diff --git a/tests/baselines/reference/tupleTypesStrictNullChecks.symbols b/tests/baselines/reference/tupleTypesStrictNullChecks.symbols new file mode 100644 index 0000000000000..cda472e2f3bc6 --- /dev/null +++ b/tests/baselines/reference/tupleTypesStrictNullChecks.symbols @@ -0,0 +1,14 @@ +=== tests/cases/compiler/tupleTypesStrictNullChecks.ts === +var et: [] = []; +>et : Symbol(et, Decl(tupleTypesStrictNullChecks.ts, 0, 3)) + +var et0 = et[0]; // never +>et0 : Symbol(et0, Decl(tupleTypesStrictNullChecks.ts, 1, 3), Decl(tupleTypesStrictNullChecks.ts, 2, 3)) +>et : Symbol(et, Decl(tupleTypesStrictNullChecks.ts, 0, 3)) + +var et0: never; +>et0 : Symbol(et0, Decl(tupleTypesStrictNullChecks.ts, 1, 3), Decl(tupleTypesStrictNullChecks.ts, 2, 3)) + +et = []; // Ok +>et : Symbol(et, Decl(tupleTypesStrictNullChecks.ts, 0, 3)) + diff --git a/tests/baselines/reference/tupleTypesStrictNullChecks.types b/tests/baselines/reference/tupleTypesStrictNullChecks.types new file mode 100644 index 0000000000000..9e663bb7f3173 --- /dev/null +++ b/tests/baselines/reference/tupleTypesStrictNullChecks.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/tupleTypesStrictNullChecks.ts === +var et: [] = []; +>et : [] +>[] : [] + +var et0 = et[0]; // never +>et0 : never +>et[0] : never +>et : [] +>0 : 0 + +var et0: never; +>et0 : never + +et = []; // Ok +>et = [] : [] +>et : [] +>[] : [] + diff --git a/tests/cases/compiler/tupleTypes.ts b/tests/cases/compiler/tupleTypes.ts index 80181f8b33279..89a90800fe1b1 100644 --- a/tests/cases/compiler/tupleTypes.ts +++ b/tests/cases/compiler/tupleTypes.ts @@ -1,7 +1,8 @@ -var v1: []; // Error +var v1: [] = []; var v2: [number]; var v3: [number, string]; var v4: [number, [string, string]]; +var v5: number[] = v1; var t: [number, string]; var t0 = t[0]; // number @@ -17,6 +18,12 @@ t = [1, "hello"]; // Ok t = ["hello", 1]; // Error t = [1, "hello", 2]; // Ok +var et: []; +var et0 = et[0]; // never +var et0: never; +et = []; // Ok +et = [1]; // Error + var tf: [string, (x: string) => number] = ["hello", x => x.length]; declare function ff(a: T, b: [T, (x: T) => U]): U; @@ -44,10 +51,15 @@ var a: number[]; var a1: [number, string]; var a2: [number, number]; var a3: [number, {}]; +var a4: []; a = a1; // Error a = a2; a = a3; // Error +a = a4; a1 = a2; // Error a1 = a3; // Error +a1 = a4; // Error a3 = a1; a3 = a2; +a3 = a4; // Error +a4 = a1; // Error diff --git a/tests/cases/compiler/tupleTypesStrictNullChecks.ts b/tests/cases/compiler/tupleTypesStrictNullChecks.ts new file mode 100644 index 0000000000000..005ea8d985c58 --- /dev/null +++ b/tests/cases/compiler/tupleTypesStrictNullChecks.ts @@ -0,0 +1,7 @@ +// @strictNullChecks: true + +var et: [] = []; +var et0 = et[0]; // never +var et0: never; + +et = []; // Ok