Revise mapped tuple type instantiation logic (#57031)

This commit is contained in:
Anders Hejlsberg 2024-01-19 10:44:19 -08:00 committed by GitHub
parent 4a34f45099
commit 458eae07d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 612 additions and 257 deletions

View File

@ -19759,11 +19759,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
) {
return instantiateMappedArrayType(t, type, prependTypeMapping(typeVariable, t, mapper));
}
if (isGenericTupleType(t)) {
return instantiateMappedGenericTupleType(t, type, typeVariable, mapper);
}
if (isTupleType(t)) {
return instantiateMappedTupleType(t, type, prependTypeMapping(typeVariable, t, mapper));
return instantiateMappedTupleType(t, type, typeVariable, mapper);
}
}
return instantiateAnonymousType(type, prependTypeMapping(typeVariable, t, mapper));
@ -19783,26 +19780,32 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
return modifiers & MappedTypeModifiers.IncludeReadonly ? true : modifiers & MappedTypeModifiers.ExcludeReadonly ? false : state;
}
function instantiateMappedGenericTupleType(tupleType: TupleTypeReference, mappedType: MappedType, typeVariable: TypeVariable, mapper: TypeMapper) {
// When a tuple type is generic (i.e. when it contains variadic elements), we want to eagerly map the
// non-generic elements and defer mapping the generic elements. In order to facilitate this, we transform
// M<[A, B?, ...T, ...C[]] into [...M<[A]>, ...M<[B?]>, ...M<T>, ...M<C[]>] and then rely on tuple type
// normalization to resolve the non-generic parts of the resulting tuple.
function instantiateMappedTupleType(tupleType: TupleTypeReference, mappedType: MappedType, typeVariable: TypeVariable, mapper: TypeMapper) {
// We apply the mapped type's template type to each of the fixed part elements. For variadic elements, we
// apply the mapped type itself to the variadic element type. For other elements in the variable part of the
// tuple, we surround the element type with an array type and apply the mapped type to that. This ensures
// that we get sequential property key types for the fixed part of the tuple, and property key type number
// for the remaining elements. For example
//
// type Keys<T> = { [K in keyof T]: K };
// type Foo<T extends any[]> = Keys<[string, string, ...T, string]>; // ["0", "1", ...Keys<T>, number]
//
const elementFlags = tupleType.target.elementFlags;
const elementTypes = map(getElementTypes(tupleType), (t, i) => {
const singleton = elementFlags[i] & ElementFlags.Variadic ? t :
elementFlags[i] & ElementFlags.Rest ? createArrayType(t) :
createTupleType([t], [elementFlags[i]]);
// avoid infinite recursion, if the singleton is the type variable itself
// then we'd just get back here with the same arguments from within instantiateMappedType
if (singleton === typeVariable) {
return mappedType;
}
// The singleton is never a generic tuple type, so it is safe to recurse here.
return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper));
const fixedLength = tupleType.target.fixedLength;
const fixedMapper = fixedLength ? prependTypeMapping(typeVariable, tupleType, mapper) : mapper;
const newElementTypes = map(getElementTypes(tupleType), (type, i) => {
const flags = elementFlags[i];
return i < fixedLength ? instantiateMappedTypeTemplate(mappedType, getStringLiteralType("" + i), !!(flags & ElementFlags.Optional), fixedMapper) :
flags & ElementFlags.Variadic ? instantiateType(mappedType, prependTypeMapping(typeVariable, type, mapper)) :
getElementTypeOfArrayType(instantiateType(mappedType, prependTypeMapping(typeVariable, createArrayType(type), mapper))) ?? unknownType;
});
const modifiers = getMappedTypeModifiers(mappedType);
const newElementFlags = modifiers & MappedTypeModifiers.IncludeOptional ? map(elementFlags, f => f & ElementFlags.Required ? ElementFlags.Optional : f) :
modifiers & MappedTypeModifiers.ExcludeOptional ? map(elementFlags, f => f & ElementFlags.Optional ? ElementFlags.Required : f) :
elementFlags;
const newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType));
return createTupleType(elementTypes, map(elementTypes, _ => ElementFlags.Variadic), newReadonly);
return contains(newElementTypes, errorType) ? errorType :
createTupleType(newElementTypes, newElementFlags, newReadonly, tupleType.target.labeledElementDeclarations);
}
function instantiateMappedArrayType(arrayType: Type, mappedType: MappedType, mapper: TypeMapper) {
@ -19811,18 +19814,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
createArrayType(elementType, getModifiedReadonlyState(isReadonlyArrayType(arrayType), getMappedTypeModifiers(mappedType)));
}
function instantiateMappedTupleType(tupleType: TupleTypeReference, mappedType: MappedType, mapper: TypeMapper) {
const elementFlags = tupleType.target.elementFlags;
const elementTypes = map(getElementTypes(tupleType), (_, i) => instantiateMappedTypeTemplate(mappedType, getStringLiteralType("" + i), !!(elementFlags[i] & ElementFlags.Optional), mapper));
const modifiers = getMappedTypeModifiers(mappedType);
const newTupleModifiers = modifiers & MappedTypeModifiers.IncludeOptional ? map(elementFlags, f => f & ElementFlags.Required ? ElementFlags.Optional : f) :
modifiers & MappedTypeModifiers.ExcludeOptional ? map(elementFlags, f => f & ElementFlags.Optional ? ElementFlags.Required : f) :
elementFlags;
const newReadonly = getModifiedReadonlyState(tupleType.target.readonly, modifiers);
return contains(elementTypes, errorType) ? errorType :
createTupleType(elementTypes, newTupleModifiers, newReadonly, tupleType.target.labeledElementDeclarations);
}
function instantiateMappedTypeTemplate(type: MappedType, key: Type, isOptional: boolean, mapper: TypeMapper) {
const templateMapper = appendTypeMapping(mapper, getTypeParameterFromMappedType(type), key);
const propType = instantiateType(getTemplateTypeFromMappedType(type.target as MappedType || type), templateMapper);
@ -40441,11 +40432,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
function checkTupleType(node: TupleTypeNode) {
const elementTypes = node.elements;
let seenOptionalElement = false;
let seenRestElement = false;
for (const e of elementTypes) {
const flags = getTupleElementFlags(e);
for (const e of node.elements) {
let flags = getTupleElementFlags(e);
if (flags & ElementFlags.Variadic) {
const type = getTypeFromTypeNode((e as RestTypeNode | NamedTupleMember).type);
if (!isArrayLikeType(type)) {
@ -40453,10 +40443,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
break;
}
if (isArrayType(type) || isTupleType(type) && type.target.combinedFlags & ElementFlags.Rest) {
seenRestElement = true;
flags |= ElementFlags.Rest;
}
}
else if (flags & ElementFlags.Rest) {
if (flags & ElementFlags.Rest) {
if (seenRestElement) {
grammarErrorOnNode(e, Diagnostics.A_rest_element_cannot_follow_another_rest_element);
break;
@ -40470,7 +40460,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
seenOptionalElement = true;
}
else if (seenOptionalElement) {
else if (flags & ElementFlags.Required && seenOptionalElement) {
grammarErrorOnNode(e, Diagnostics.A_required_element_cannot_follow_an_optional_element);
break;
}

View File

@ -0,0 +1,20 @@
circularInlineMappedGenericTupleTypeNoCrash.ts(11,12): error TS2589: Type instantiation is excessively deep and possibly infinite.
==== circularInlineMappedGenericTupleTypeNoCrash.ts (1 errors) ====
class Foo<Elements extends readonly unknown[]> {
public readonly elements: { [P in keyof Elements]: { bar: Elements[P] } };
public constructor(
...elements: { [P in keyof Elements]: { bar: Elements[P] } }
) {
this.elements = elements;
}
public add(): Foo<[...Elements, "abc"]> {
return new Foo<[...Elements, "abc"]>(...this.elements, { bar: "abc" });
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
}
}

View File

@ -32,8 +32,8 @@ class Foo<Elements extends readonly unknown[]> {
>this.elements : { [P in keyof Elements]: { bar: Elements[P]; }; }
>this : this
>elements : { [P in keyof Elements]: { bar: Elements[P]; }; }
>{ bar: "abc" } : { bar: "abc"; }
>bar : "abc"
>{ bar: "abc" } : { bar: string; }
>bar : string
>"abc" : "abc"
}
}

View File

@ -0,0 +1,151 @@
//// [tests/cases/conformance/types/mapped/mappedTypesGenericTuples.ts] ////
=== mappedTypesGenericTuples.ts ===
// Property keys are `number` following the fixed part of a tuple
type K<T> = { [P in keyof T]: P };
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 2, 7))
>P : Symbol(P, Decl(mappedTypesGenericTuples.ts, 2, 15))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 2, 7))
>P : Symbol(P, Decl(mappedTypesGenericTuples.ts, 2, 15))
type M<T> = { [P in keyof T]: T[P] };
>M : Symbol(M, Decl(mappedTypesGenericTuples.ts, 2, 34))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 3, 7))
>P : Symbol(P, Decl(mappedTypesGenericTuples.ts, 3, 15))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 3, 7))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 3, 7))
>P : Symbol(P, Decl(mappedTypesGenericTuples.ts, 3, 15))
type KA = K<[string, string, boolean]>; // ["0", "1", "2"]
>KA : Symbol(KA, Decl(mappedTypesGenericTuples.ts, 3, 37))
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
type KB = K<[string, string, ...string[], string]>; // ["0", "1", ...number[], number]
>KB : Symbol(KB, Decl(mappedTypesGenericTuples.ts, 5, 39))
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
type KC = K<[...string[]]>; // number[]
>KC : Symbol(KC, Decl(mappedTypesGenericTuples.ts, 6, 51))
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
type KD = K<string[]>; // number[]
>KD : Symbol(KD, Decl(mappedTypesGenericTuples.ts, 7, 27))
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
type A = { a: string };
>A : Symbol(A, Decl(mappedTypesGenericTuples.ts, 8, 22))
>a : Symbol(a, Decl(mappedTypesGenericTuples.ts, 10, 10))
type B = { b: string };
>B : Symbol(B, Decl(mappedTypesGenericTuples.ts, 10, 23))
>b : Symbol(b, Decl(mappedTypesGenericTuples.ts, 11, 10))
type C = { c: string };
>C : Symbol(C, Decl(mappedTypesGenericTuples.ts, 11, 23))
>c : Symbol(c, Decl(mappedTypesGenericTuples.ts, 12, 10))
type D = { d: string };
>D : Symbol(D, Decl(mappedTypesGenericTuples.ts, 12, 23))
>d : Symbol(d, Decl(mappedTypesGenericTuples.ts, 13, 10))
type V0<T extends unknown[]> = [A, B?, ...T, ...C[]]
>V0 : Symbol(V0, Decl(mappedTypesGenericTuples.ts, 13, 23))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 15, 8))
>A : Symbol(A, Decl(mappedTypesGenericTuples.ts, 8, 22))
>B : Symbol(B, Decl(mappedTypesGenericTuples.ts, 10, 23))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 15, 8))
>C : Symbol(C, Decl(mappedTypesGenericTuples.ts, 11, 23))
type V1<T extends unknown[]> = [A, ...T, B, ...C[], D]
>V1 : Symbol(V1, Decl(mappedTypesGenericTuples.ts, 15, 52))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 16, 8))
>A : Symbol(A, Decl(mappedTypesGenericTuples.ts, 8, 22))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 16, 8))
>B : Symbol(B, Decl(mappedTypesGenericTuples.ts, 10, 23))
>C : Symbol(C, Decl(mappedTypesGenericTuples.ts, 11, 23))
>D : Symbol(D, Decl(mappedTypesGenericTuples.ts, 12, 23))
type K0<T extends unknown[]> = K<V0<T>>; // ["0", "1"?, ...K<T>, ...number[]]
>K0 : Symbol(K0, Decl(mappedTypesGenericTuples.ts, 16, 54))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 18, 8))
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
>V0 : Symbol(V0, Decl(mappedTypesGenericTuples.ts, 13, 23))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 18, 8))
type K1<T extends unknown[]> = K<V1<T>>; // ["0", ...K<T>, number, ...number[], number]
>K1 : Symbol(K1, Decl(mappedTypesGenericTuples.ts, 18, 40))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 19, 8))
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 0, 0))
>V1 : Symbol(V1, Decl(mappedTypesGenericTuples.ts, 15, 52))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 19, 8))
type M0<T extends unknown[]> = M<V0<T>>; // [A, B?, ...M<T>, ...C[]]
>M0 : Symbol(M0, Decl(mappedTypesGenericTuples.ts, 19, 40))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 21, 8))
>M : Symbol(M, Decl(mappedTypesGenericTuples.ts, 2, 34))
>V0 : Symbol(V0, Decl(mappedTypesGenericTuples.ts, 13, 23))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 21, 8))
type M1<T extends unknown[]> = M<V1<T>>; // [A, ...M<T>, B, ...C[], D]
>M1 : Symbol(M1, Decl(mappedTypesGenericTuples.ts, 21, 40))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 22, 8))
>M : Symbol(M, Decl(mappedTypesGenericTuples.ts, 2, 34))
>V1 : Symbol(V1, Decl(mappedTypesGenericTuples.ts, 15, 52))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 22, 8))
// Repro from #48856
type Keys<O extends unknown[]> = { [K in keyof O]: K };
>Keys : Symbol(Keys, Decl(mappedTypesGenericTuples.ts, 22, 40))
>O : Symbol(O, Decl(mappedTypesGenericTuples.ts, 26, 10))
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 26, 36))
>O : Symbol(O, Decl(mappedTypesGenericTuples.ts, 26, 10))
>K : Symbol(K, Decl(mappedTypesGenericTuples.ts, 26, 36))
type Keys1 = Keys<[string, ...string[]]>;
>Keys1 : Symbol(Keys1, Decl(mappedTypesGenericTuples.ts, 26, 55))
>Keys : Symbol(Keys, Decl(mappedTypesGenericTuples.ts, 22, 40))
type Keys2 = Keys<[string, ...string[], number]>;
>Keys2 : Symbol(Keys2, Decl(mappedTypesGenericTuples.ts, 28, 41))
>Keys : Symbol(Keys, Decl(mappedTypesGenericTuples.ts, 22, 40))
// Repro from #56888
type T1 = ['a', 'b', 'c'] extends readonly [infer H, ...unknown[]] ? H : never; // "a"
>T1 : Symbol(T1, Decl(mappedTypesGenericTuples.ts, 29, 49))
>H : Symbol(H, Decl(mappedTypesGenericTuples.ts, 33, 49))
>H : Symbol(H, Decl(mappedTypesGenericTuples.ts, 33, 49))
type T2 = ['a', 'b', 'c'] extends Readonly<[infer H, ...unknown[]]> ? H : never; // "a"
>T2 : Symbol(T2, Decl(mappedTypesGenericTuples.ts, 33, 79))
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
>H : Symbol(H, Decl(mappedTypesGenericTuples.ts, 34, 49))
>H : Symbol(H, Decl(mappedTypesGenericTuples.ts, 34, 49))
type T3 = ['a', 'b', 'c'] extends readonly [...unknown[], infer L] ? L : never; // "c"
>T3 : Symbol(T3, Decl(mappedTypesGenericTuples.ts, 34, 80))
>L : Symbol(L, Decl(mappedTypesGenericTuples.ts, 35, 63))
>L : Symbol(L, Decl(mappedTypesGenericTuples.ts, 35, 63))
type T4 = ['a', 'b', 'c'] extends Readonly<[...unknown[], infer L]> ? L : never; // "c"
>T4 : Symbol(T4, Decl(mappedTypesGenericTuples.ts, 35, 79))
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
>L : Symbol(L, Decl(mappedTypesGenericTuples.ts, 36, 63))
>L : Symbol(L, Decl(mappedTypesGenericTuples.ts, 36, 63))
// Repro from #56888
type R1<T> = readonly [...unknown[], T]; // readonly [...unknown[], T]
>R1 : Symbol(R1, Decl(mappedTypesGenericTuples.ts, 36, 80))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 40, 8))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 40, 8))
type R2<T> = Readonly<[...unknown[], T]>; // readonly [...unknown[], T]
>R2 : Symbol(R2, Decl(mappedTypesGenericTuples.ts, 40, 40))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 41, 8))
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(mappedTypesGenericTuples.ts, 41, 8))

View File

@ -0,0 +1,90 @@
//// [tests/cases/conformance/types/mapped/mappedTypesGenericTuples.ts] ////
=== mappedTypesGenericTuples.ts ===
// Property keys are `number` following the fixed part of a tuple
type K<T> = { [P in keyof T]: P };
>K : K<T>
type M<T> = { [P in keyof T]: T[P] };
>M : M<T>
type KA = K<[string, string, boolean]>; // ["0", "1", "2"]
>KA : ["0", "1", "2"]
type KB = K<[string, string, ...string[], string]>; // ["0", "1", ...number[], number]
>KB : ["0", "1", ...number[], number]
type KC = K<[...string[]]>; // number[]
>KC : number[]
type KD = K<string[]>; // number[]
>KD : number[]
type A = { a: string };
>A : { a: string; }
>a : string
type B = { b: string };
>B : { b: string; }
>b : string
type C = { c: string };
>C : { c: string; }
>c : string
type D = { d: string };
>D : { d: string; }
>d : string
type V0<T extends unknown[]> = [A, B?, ...T, ...C[]]
>V0 : [A, (B | undefined)?, ...T, ...C[]]
type V1<T extends unknown[]> = [A, ...T, B, ...C[], D]
>V1 : [A, ...T, B, ...C[], D]
type K0<T extends unknown[]> = K<V0<T>>; // ["0", "1"?, ...K<T>, ...number[]]
>K0 : ["0", ("1" | undefined)?, ...K<T>, ...number[]]
type K1<T extends unknown[]> = K<V1<T>>; // ["0", ...K<T>, number, ...number[], number]
>K1 : ["0", ...K<T>, number, ...number[], number]
type M0<T extends unknown[]> = M<V0<T>>; // [A, B?, ...M<T>, ...C[]]
>M0 : [A, (B | undefined)?, ...M<T>, ...C[]]
type M1<T extends unknown[]> = M<V1<T>>; // [A, ...M<T>, B, ...C[], D]
>M1 : [A, ...M<T>, B, ...C[], D]
// Repro from #48856
type Keys<O extends unknown[]> = { [K in keyof O]: K };
>Keys : Keys<O>
type Keys1 = Keys<[string, ...string[]]>;
>Keys1 : ["0", ...number[]]
type Keys2 = Keys<[string, ...string[], number]>;
>Keys2 : ["0", ...number[], number]
// Repro from #56888
type T1 = ['a', 'b', 'c'] extends readonly [infer H, ...unknown[]] ? H : never; // "a"
>T1 : "a"
type T2 = ['a', 'b', 'c'] extends Readonly<[infer H, ...unknown[]]> ? H : never; // "a"
>T2 : "a"
type T3 = ['a', 'b', 'c'] extends readonly [...unknown[], infer L] ? L : never; // "c"
>T3 : "c"
type T4 = ['a', 'b', 'c'] extends Readonly<[...unknown[], infer L]> ? L : never; // "c"
>T4 : "c"
// Repro from #56888
type R1<T> = readonly [...unknown[], T]; // readonly [...unknown[], T]
>R1 : R1<T>
type R2<T> = Readonly<[...unknown[], T]>; // readonly [...unknown[], T]
>R2 : readonly [...unknown[], T]

View File

@ -1,71 +1,75 @@
variadicTuples2.ts(7,34): error TS1265: A rest element cannot follow another rest element.
variadicTuples2.ts(8,34): error TS1266: An optional element cannot follow a rest element.
variadicTuples2.ts(9,30): error TS1257: A required element cannot follow an optional element.
variadicTuples2.ts(42,1): error TS2322: Type '[string, string, number, number]' is not assignable to type '[...string[], number]'.
variadicTuples2.ts(11,26): error TS1265: A rest element cannot follow another rest element.
variadicTuples2.ts(12,26): error TS1265: A rest element cannot follow another rest element.
variadicTuples2.ts(13,31): error TS1265: A rest element cannot follow another rest element.
variadicTuples2.ts(14,31): error TS1265: A rest element cannot follow another rest element.
variadicTuples2.ts(47,1): error TS2322: Type '[string, string, number, number]' is not assignable to type '[...string[], number]'.
Type at positions 0 through 2 in source is not compatible with type at position 0 in target.
Type 'number' is not assignable to type 'string'.
variadicTuples2.ts(48,5): error TS2345: Argument of type '["abc", "def", 5, 6]' is not assignable to parameter of type '[...strs: string[], num: number]'.
variadicTuples2.ts(53,5): error TS2345: Argument of type '["abc", "def", 5, 6]' is not assignable to parameter of type '[...strs: string[], num: number]'.
Type at positions 0 through 2 in source is not compatible with type at position 0 in target.
Type 'number' is not assignable to type 'string'.
variadicTuples2.ts(51,1): error TS2322: Type '[number]' is not assignable to type '[number, ...string[], number]'.
variadicTuples2.ts(56,1): error TS2322: Type '[number]' is not assignable to type '[number, ...string[], number]'.
Source has 1 element(s) but target requires 2.
variadicTuples2.ts(53,1): error TS2322: Type '[number, number, number]' is not assignable to type '[number, ...string[], number]'.
variadicTuples2.ts(58,1): error TS2322: Type '[number, number, number]' is not assignable to type '[number, ...string[], number]'.
Type at position 1 in source is not compatible with type at position 1 in target.
Type 'number' is not assignable to type 'string'.
variadicTuples2.ts(56,1): error TS2322: Type '[number, string, number, string]' is not assignable to type '[number, ...string[], number]'.
variadicTuples2.ts(61,1): error TS2322: Type '[number, string, number, string]' is not assignable to type '[number, ...string[], number]'.
Type at positions 1 through 2 in source is not compatible with type at position 1 in target.
Type 'number' is not assignable to type 'string'.
variadicTuples2.ts(57,8): error TS2322: Type 'boolean' is not assignable to type 'number'.
variadicTuples2.ts(58,1): error TS2322: Type '[number, string, string, boolean]' is not assignable to type '[number, ...string[], number]'.
variadicTuples2.ts(62,8): error TS2322: Type 'boolean' is not assignable to type 'number'.
variadicTuples2.ts(63,1): error TS2322: Type '[number, string, string, boolean]' is not assignable to type '[number, ...string[], number]'.
Type at position 3 in source is not compatible with type at position 2 in target.
Type 'boolean' is not assignable to type 'number'.
variadicTuples2.ts(61,1): error TS2345: Argument of type '[]' is not assignable to parameter of type '[...strs: string[], n2: number]'.
variadicTuples2.ts(66,1): error TS2345: Argument of type '[]' is not assignable to parameter of type '[...strs: string[], n2: number]'.
Source has 0 element(s) but target requires 1.
variadicTuples2.ts(63,8): error TS2345: Argument of type '[1, 2]' is not assignable to parameter of type '[...strs: string[], n2: number]'.
variadicTuples2.ts(68,8): error TS2345: Argument of type '[1, 2]' is not assignable to parameter of type '[...strs: string[], n2: number]'.
Type at position 0 in source is not compatible with type at position 0 in target.
Type 'number' is not assignable to type 'string'.
variadicTuples2.ts(66,8): error TS2345: Argument of type '["abc", 1, "def"]' is not assignable to parameter of type '[...strs: string[], n2: number]'.
variadicTuples2.ts(71,8): error TS2345: Argument of type '["abc", 1, "def"]' is not assignable to parameter of type '[...strs: string[], n2: number]'.
Type at positions 0 through 1 in source is not compatible with type at position 0 in target.
Type 'number' is not assignable to type 'string'.
variadicTuples2.ts(67,5): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'number'.
variadicTuples2.ts(68,8): error TS2345: Argument of type '["abc", "def", true]' is not assignable to parameter of type '[...strs: string[], n2: number]'.
variadicTuples2.ts(72,5): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'number'.
variadicTuples2.ts(73,8): error TS2345: Argument of type '["abc", "def", true]' is not assignable to parameter of type '[...strs: string[], n2: number]'.
Type at position 2 in source is not compatible with type at position 1 in target.
Type 'boolean' is not assignable to type 'number'.
variadicTuples2.ts(71,5): error TS2322: Type '[number, number]' is not assignable to type '[number, ...T]'.
variadicTuples2.ts(76,5): error TS2322: Type '[number, number]' is not assignable to type '[number, ...T]'.
Source provides no match for variadic element at position 1 in target.
variadicTuples2.ts(72,5): error TS2322: Type '[number, ...number[]]' is not assignable to type '[number, ...T]'.
variadicTuples2.ts(77,5): error TS2322: Type '[number, ...number[]]' is not assignable to type '[number, ...T]'.
Target requires 2 element(s) but source may have fewer.
variadicTuples2.ts(73,5): error TS2322: Type '[number, ...T]' is not assignable to type '[number, number]'.
variadicTuples2.ts(78,5): error TS2322: Type '[number, ...T]' is not assignable to type '[number, number]'.
Type '[number, ...unknown[]]' is not assignable to type '[number, number]'.
Target requires 2 element(s) but source may have fewer.
variadicTuples2.ts(74,5): error TS2322: Type '[number, ...T]' is not assignable to type '[number, ...number[]]'.
variadicTuples2.ts(79,5): error TS2322: Type '[number, ...T]' is not assignable to type '[number, ...number[]]'.
Type '[number, ...unknown[]]' is not assignable to type '[number, ...number[]]'.
Type at position 1 in source is not compatible with type at position 1 in target.
Type 'unknown' is not assignable to type 'number'.
variadicTuples2.ts(79,5): error TS2322: Type '[number, string, ...any[]]' is not assignable to type '[number, ...number[]]'.
variadicTuples2.ts(84,5): error TS2322: Type '[number, string, ...any[]]' is not assignable to type '[number, ...number[]]'.
Type at positions 1 through 2 in source is not compatible with type at position 1 in target.
Type 'string' is not assignable to type 'number'.
variadicTuples2.ts(111,16): error TS2345: Argument of type '[1, 2, 3, number]' is not assignable to parameter of type '[...number[], (...values: number[]) => void]'.
variadicTuples2.ts(116,16): error TS2345: Argument of type '[1, 2, 3, number]' is not assignable to parameter of type '[...number[], (...values: number[]) => void]'.
Type at position 3 in source is not compatible with type at position 1 in target.
Type 'number' is not assignable to type '(...values: number[]) => void'.
variadicTuples2.ts(112,6): error TS2345: Argument of type 'string[]' is not assignable to parameter of type '[...string[], (...values: string[]) => void]'.
variadicTuples2.ts(117,6): error TS2345: Argument of type 'string[]' is not assignable to parameter of type '[...string[], (...values: string[]) => void]'.
Source provides no match for required element at position 1 in target.
variadicTuples2.ts(115,5): error TS2345: Argument of type '[]' is not assignable to parameter of type '[...unknown[], unknown, unknown]'.
variadicTuples2.ts(120,5): error TS2345: Argument of type '[]' is not assignable to parameter of type '[...unknown[], unknown, unknown]'.
Source has 0 element(s) but target requires 2.
variadicTuples2.ts(116,5): error TS2345: Argument of type '[number]' is not assignable to parameter of type '[...unknown[], unknown, unknown]'.
variadicTuples2.ts(121,5): error TS2345: Argument of type '[number]' is not assignable to parameter of type '[...unknown[], unknown, unknown]'.
Source has 1 element(s) but target requires 2.
variadicTuples2.ts(121,5): error TS2345: Argument of type '[]' is not assignable to parameter of type '[unknown, ...unknown[], unknown]'.
variadicTuples2.ts(126,5): error TS2345: Argument of type '[]' is not assignable to parameter of type '[unknown, ...unknown[], unknown]'.
Source has 0 element(s) but target requires 2.
variadicTuples2.ts(122,5): error TS2345: Argument of type '[number]' is not assignable to parameter of type '[unknown, ...unknown[], unknown]'.
variadicTuples2.ts(127,5): error TS2345: Argument of type '[number]' is not assignable to parameter of type '[unknown, ...unknown[], unknown]'.
Source has 1 element(s) but target requires 2.
variadicTuples2.ts(132,16): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
variadicTuples2.ts(133,16): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
variadicTuples2.ts(134,25): error TS2345: Argument of type '["blah2", 1, 2, 3]' is not assignable to parameter of type '[...string[], number]'.
variadicTuples2.ts(137,16): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
variadicTuples2.ts(138,16): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
variadicTuples2.ts(139,25): error TS2345: Argument of type '["blah2", 1, 2, 3]' is not assignable to parameter of type '[...string[], number]'.
Type at positions 0 through 2 in source is not compatible with type at position 0 in target.
Type 'number' is not assignable to type 'string'.
==== variadicTuples2.ts (29 errors) ====
==== variadicTuples2.ts (33 errors) ====
// Declarations
type V00 = [number, ...string[]];
@ -82,6 +86,19 @@ variadicTuples2.ts(134,25): error TS2345: Argument of type '["blah2", 1, 2, 3]'
~~~~~~~
!!! error TS1257: A required element cannot follow an optional element.
type V15 = [...string[], ...number[]]; // Error
~~~~~~~~~~~
!!! error TS1265: A rest element cannot follow another rest element.
type V16 = [...string[], ...Array<number>]; // Error
~~~~~~~~~~~~~~~~
!!! error TS1265: A rest element cannot follow another rest element.
type V17 = [...Array<string>, ...number[]]; // Error
~~~~~~~~~~~
!!! error TS1265: A rest element cannot follow another rest element.
type V18 = [...Array<string>, ...Array<number>]; // Error
~~~~~~~~~~~~~~~~
!!! error TS1265: A rest element cannot follow another rest element.
// Normalization
type Tup3<T extends unknown[], U extends unknown[], V extends unknown[]> = [...T, ...U, ...V];

View File

@ -11,6 +11,11 @@ type V10 = [number, ...string[], ...boolean[]]; // Error
type V11 = [number, ...string[], boolean?]; // Error
type V12 = [number, string?, boolean]; // Error
type V15 = [...string[], ...number[]]; // Error
type V16 = [...string[], ...Array<number>]; // Error
type V17 = [...Array<string>, ...number[]]; // Error
type V18 = [...Array<string>, ...Array<number>]; // Error
// Normalization
type Tup3<T extends unknown[], U extends unknown[], V extends unknown[]> = [...T, ...U, ...V];
@ -242,6 +247,10 @@ type V03 = [number, ...string[], number];
type V10 = [number, ...string[], ...boolean[]];
type V11 = [number, ...string[], boolean?];
type V12 = [number, string?, boolean];
type V15 = [...string[], ...number[]];
type V16 = [...string[], ...Array<number>];
type V17 = [...Array<string>, ...number[]];
type V18 = [...Array<string>, ...Array<number>];
type Tup3<T extends unknown[], U extends unknown[], V extends unknown[]> = [...T, ...U, ...V];
type V20 = Tup3<[number], string[], [number]>;
type V21 = Tup3<[number], [string?], [boolean]>;

View File

@ -21,394 +21,410 @@ type V11 = [number, ...string[], boolean?]; // Error
type V12 = [number, string?, boolean]; // Error
>V12 : Symbol(V12, Decl(variadicTuples2.ts, 7, 43))
type V15 = [...string[], ...number[]]; // Error
>V15 : Symbol(V15, Decl(variadicTuples2.ts, 8, 38))
type V16 = [...string[], ...Array<number>]; // Error
>V16 : Symbol(V16, Decl(variadicTuples2.ts, 10, 38))
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
type V17 = [...Array<string>, ...number[]]; // Error
>V17 : Symbol(V17, Decl(variadicTuples2.ts, 11, 43))
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
type V18 = [...Array<string>, ...Array<number>]; // Error
>V18 : Symbol(V18, Decl(variadicTuples2.ts, 12, 43))
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
// Normalization
type Tup3<T extends unknown[], U extends unknown[], V extends unknown[]> = [...T, ...U, ...V];
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>T : Symbol(T, Decl(variadicTuples2.ts, 12, 10))
>U : Symbol(U, Decl(variadicTuples2.ts, 12, 30))
>V : Symbol(V, Decl(variadicTuples2.ts, 12, 51))
>T : Symbol(T, Decl(variadicTuples2.ts, 12, 10))
>U : Symbol(U, Decl(variadicTuples2.ts, 12, 30))
>V : Symbol(V, Decl(variadicTuples2.ts, 12, 51))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>T : Symbol(T, Decl(variadicTuples2.ts, 17, 10))
>U : Symbol(U, Decl(variadicTuples2.ts, 17, 30))
>V : Symbol(V, Decl(variadicTuples2.ts, 17, 51))
>T : Symbol(T, Decl(variadicTuples2.ts, 17, 10))
>U : Symbol(U, Decl(variadicTuples2.ts, 17, 30))
>V : Symbol(V, Decl(variadicTuples2.ts, 17, 51))
type V20 = Tup3<[number], string[], [number]>; // [number, ...string[], number]
>V20 : Symbol(V20, Decl(variadicTuples2.ts, 12, 94))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>V20 : Symbol(V20, Decl(variadicTuples2.ts, 17, 94))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
type V21 = Tup3<[number], [string?], [boolean]>; // [number, string | undefined, boolean]
>V21 : Symbol(V21, Decl(variadicTuples2.ts, 14, 46))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>V21 : Symbol(V21, Decl(variadicTuples2.ts, 19, 46))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
type V22 = Tup3<[number], string[], boolean[]>; // [number, (string | boolean)[]]
>V22 : Symbol(V22, Decl(variadicTuples2.ts, 15, 48))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>V22 : Symbol(V22, Decl(variadicTuples2.ts, 20, 48))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
type V23 = Tup3<[number], string[], [boolean?]>; // [number, (string | boolean | undefined)[]]
>V23 : Symbol(V23, Decl(variadicTuples2.ts, 16, 47))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>V23 : Symbol(V23, Decl(variadicTuples2.ts, 21, 47))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
type V24 = Tup3<[number], [boolean?], string[]>; // [number, boolean?, ...string[]]
>V24 : Symbol(V24, Decl(variadicTuples2.ts, 17, 48))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>V24 : Symbol(V24, Decl(variadicTuples2.ts, 22, 48))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
type V25 = Tup3<string[], number[], boolean[]>; // (string | number | boolean)[]
>V25 : Symbol(V25, Decl(variadicTuples2.ts, 18, 48))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>V25 : Symbol(V25, Decl(variadicTuples2.ts, 23, 48))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
type V26 = Tup3<string[], number[], [boolean]>; // [...(string | number)[], boolean]
>V26 : Symbol(V26, Decl(variadicTuples2.ts, 19, 47))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>V26 : Symbol(V26, Decl(variadicTuples2.ts, 24, 47))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
type V27 = Tup3<[number?], [string], [boolean?]>; // [number | undefined, string, boolean?]
>V27 : Symbol(V27, Decl(variadicTuples2.ts, 20, 47))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>V27 : Symbol(V27, Decl(variadicTuples2.ts, 25, 47))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
type V30<A extends unknown[]> = Tup3<A, string[], number[]>; // [...A, ...(string | number)[]]
>V30 : Symbol(V30, Decl(variadicTuples2.ts, 21, 49))
>A : Symbol(A, Decl(variadicTuples2.ts, 23, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>A : Symbol(A, Decl(variadicTuples2.ts, 23, 9))
>V30 : Symbol(V30, Decl(variadicTuples2.ts, 26, 49))
>A : Symbol(A, Decl(variadicTuples2.ts, 28, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>A : Symbol(A, Decl(variadicTuples2.ts, 28, 9))
type V31<A extends unknown[]> = Tup3<string[], A, number[]>; // (string | number | A[number])[]
>V31 : Symbol(V31, Decl(variadicTuples2.ts, 23, 60))
>A : Symbol(A, Decl(variadicTuples2.ts, 24, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>A : Symbol(A, Decl(variadicTuples2.ts, 24, 9))
>V31 : Symbol(V31, Decl(variadicTuples2.ts, 28, 60))
>A : Symbol(A, Decl(variadicTuples2.ts, 29, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>A : Symbol(A, Decl(variadicTuples2.ts, 29, 9))
type V32<A extends unknown[]> = Tup3<string[], number[], A>; // [...(string | number)[], ...A]
>V32 : Symbol(V32, Decl(variadicTuples2.ts, 24, 60))
>A : Symbol(A, Decl(variadicTuples2.ts, 25, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>A : Symbol(A, Decl(variadicTuples2.ts, 25, 9))
>V32 : Symbol(V32, Decl(variadicTuples2.ts, 29, 60))
>A : Symbol(A, Decl(variadicTuples2.ts, 30, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>A : Symbol(A, Decl(variadicTuples2.ts, 30, 9))
type V40<A extends unknown[]> = Tup3<A, [string?], number[]>; // [...A, string?, ...number[]]
>V40 : Symbol(V40, Decl(variadicTuples2.ts, 25, 60))
>A : Symbol(A, Decl(variadicTuples2.ts, 27, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>A : Symbol(A, Decl(variadicTuples2.ts, 27, 9))
>V40 : Symbol(V40, Decl(variadicTuples2.ts, 30, 60))
>A : Symbol(A, Decl(variadicTuples2.ts, 32, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>A : Symbol(A, Decl(variadicTuples2.ts, 32, 9))
type V41<A extends unknown[]> = Tup3<[string?], A, number[]>; // [string?, ...A, ...number[]]
>V41 : Symbol(V41, Decl(variadicTuples2.ts, 27, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 28, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>A : Symbol(A, Decl(variadicTuples2.ts, 28, 9))
>V41 : Symbol(V41, Decl(variadicTuples2.ts, 32, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 33, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>A : Symbol(A, Decl(variadicTuples2.ts, 33, 9))
type V42<A extends unknown[]> = Tup3<[string?], number[], A>; // [string?, ...number[], ...A]
>V42 : Symbol(V42, Decl(variadicTuples2.ts, 28, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 29, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>A : Symbol(A, Decl(variadicTuples2.ts, 29, 9))
>V42 : Symbol(V42, Decl(variadicTuples2.ts, 33, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 34, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>A : Symbol(A, Decl(variadicTuples2.ts, 34, 9))
type V50<A extends unknown[]> = Tup3<A, string[], [number?]>; // [...A, ...(string | number | undefined)[]]
>V50 : Symbol(V50, Decl(variadicTuples2.ts, 29, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 31, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>A : Symbol(A, Decl(variadicTuples2.ts, 31, 9))
>V50 : Symbol(V50, Decl(variadicTuples2.ts, 34, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 36, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>A : Symbol(A, Decl(variadicTuples2.ts, 36, 9))
type V51<A extends unknown[]> = Tup3<string[], A, [number?]>; // (string | number | A[number] | undefined)[]
>V51 : Symbol(V51, Decl(variadicTuples2.ts, 31, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 32, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>A : Symbol(A, Decl(variadicTuples2.ts, 32, 9))
>V51 : Symbol(V51, Decl(variadicTuples2.ts, 36, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 37, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>A : Symbol(A, Decl(variadicTuples2.ts, 37, 9))
type V52<A extends unknown[]> = Tup3<string[], [number?], A>; // [...(string | number | undefined)[], ...A]
>V52 : Symbol(V52, Decl(variadicTuples2.ts, 32, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 33, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 8, 38))
>A : Symbol(A, Decl(variadicTuples2.ts, 33, 9))
>V52 : Symbol(V52, Decl(variadicTuples2.ts, 37, 61))
>A : Symbol(A, Decl(variadicTuples2.ts, 38, 9))
>Tup3 : Symbol(Tup3, Decl(variadicTuples2.ts, 13, 48))
>A : Symbol(A, Decl(variadicTuples2.ts, 38, 9))
// Assignability
declare let tt1: [...string[], number];
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 37, 11))
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 42, 11))
tt1 = [5];
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 37, 11))
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 42, 11))
tt1 = ['abc', 5];
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 37, 11))
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 42, 11))
tt1 = ['abc', 'def', 5];
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 37, 11))
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 42, 11))
tt1 = ['abc', 'def', 5, 6]; // Error
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 37, 11))
>tt1 : Symbol(tt1, Decl(variadicTuples2.ts, 42, 11))
declare function ft1(...args: [...strs: string[], num: number]): void;
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 41, 27))
>args : Symbol(args, Decl(variadicTuples2.ts, 43, 21))
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 46, 27))
>args : Symbol(args, Decl(variadicTuples2.ts, 48, 21))
ft1(5);
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 41, 27))
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 46, 27))
ft1('abc', 5);
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 41, 27))
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 46, 27))
ft1('abc', 'def', 5);
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 41, 27))
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 46, 27))
ft1('abc', 'def', 5, 6); // Error
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 41, 27))
>ft1 : Symbol(ft1, Decl(variadicTuples2.ts, 46, 27))
declare let tt2: [number, ...string[], number];
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 49, 11))
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 54, 11))
tt2 = [0]; // Error
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 49, 11))
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 54, 11))
tt2 = [0, 1];
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 49, 11))
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 54, 11))
tt2 = [0, 1, 2]; // Error
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 49, 11))
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 54, 11))
tt2 = [0, 'abc', 1];
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 49, 11))
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 54, 11))
tt2 = [0, 'abc', 'def', 1];
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 49, 11))
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 54, 11))
tt2 = [0, 'abc', 1, 'def']; // Error
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 49, 11))
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 54, 11))
tt2 = [true, 'abc', 'def', 1]; // Error
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 49, 11))
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 54, 11))
tt2 = [0, 'abc', 'def', true]; // Error
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 49, 11))
>tt2 : Symbol(tt2, Decl(variadicTuples2.ts, 54, 11))
declare function ft2(n1: number, ...rest: [...strs: string[], n2: number]): void;
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 57, 30))
>n1 : Symbol(n1, Decl(variadicTuples2.ts, 59, 21))
>rest : Symbol(rest, Decl(variadicTuples2.ts, 59, 32))
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 62, 30))
>n1 : Symbol(n1, Decl(variadicTuples2.ts, 64, 21))
>rest : Symbol(rest, Decl(variadicTuples2.ts, 64, 32))
ft2(0); // Error
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 57, 30))
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 62, 30))
ft2(0, 1);
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 57, 30))
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 62, 30))
ft2(0, 1, 2); // Error
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 57, 30))
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 62, 30))
ft2(0, 'abc', 1);
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 57, 30))
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 62, 30))
ft2(0, 'abc', 'def', 1);
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 57, 30))
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 62, 30))
ft2(0, 'abc', 1, 'def'); // Error
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 57, 30))
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 62, 30))
ft2(true, 'abc', 'def', 1); // Error
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 57, 30))
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 62, 30))
ft2(0, 'abc', 'def', true); // Error
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 57, 30))
>ft2 : Symbol(ft2, Decl(variadicTuples2.ts, 62, 30))
function ft3<T extends unknown[]>(x: [number, ...T], y: [number, number], z: [number, ...number[]]) {
>ft3 : Symbol(ft3, Decl(variadicTuples2.ts, 67, 27))
>T : Symbol(T, Decl(variadicTuples2.ts, 69, 13))
>x : Symbol(x, Decl(variadicTuples2.ts, 69, 34))
>T : Symbol(T, Decl(variadicTuples2.ts, 69, 13))
>y : Symbol(y, Decl(variadicTuples2.ts, 69, 52))
>z : Symbol(z, Decl(variadicTuples2.ts, 69, 73))
>ft3 : Symbol(ft3, Decl(variadicTuples2.ts, 72, 27))
>T : Symbol(T, Decl(variadicTuples2.ts, 74, 13))
>x : Symbol(x, Decl(variadicTuples2.ts, 74, 34))
>T : Symbol(T, Decl(variadicTuples2.ts, 74, 13))
>y : Symbol(y, Decl(variadicTuples2.ts, 74, 52))
>z : Symbol(z, Decl(variadicTuples2.ts, 74, 73))
x = y; // Error
>x : Symbol(x, Decl(variadicTuples2.ts, 69, 34))
>y : Symbol(y, Decl(variadicTuples2.ts, 69, 52))
>x : Symbol(x, Decl(variadicTuples2.ts, 74, 34))
>y : Symbol(y, Decl(variadicTuples2.ts, 74, 52))
x = z; // Error
>x : Symbol(x, Decl(variadicTuples2.ts, 69, 34))
>z : Symbol(z, Decl(variadicTuples2.ts, 69, 73))
>x : Symbol(x, Decl(variadicTuples2.ts, 74, 34))
>z : Symbol(z, Decl(variadicTuples2.ts, 74, 73))
y = x; // Error
>y : Symbol(y, Decl(variadicTuples2.ts, 69, 52))
>x : Symbol(x, Decl(variadicTuples2.ts, 69, 34))
>y : Symbol(y, Decl(variadicTuples2.ts, 74, 52))
>x : Symbol(x, Decl(variadicTuples2.ts, 74, 34))
z = x; // Error
>z : Symbol(z, Decl(variadicTuples2.ts, 69, 73))
>x : Symbol(x, Decl(variadicTuples2.ts, 69, 34))
>z : Symbol(z, Decl(variadicTuples2.ts, 74, 73))
>x : Symbol(x, Decl(variadicTuples2.ts, 74, 34))
}
// repro #50216
declare let tt3: [number, string, ...any[]]
>tt3 : Symbol(tt3, Decl(variadicTuples2.ts, 77, 11))
>tt3 : Symbol(tt3, Decl(variadicTuples2.ts, 82, 11))
let tt4: [number, ...number[]] = tt3 // Error
>tt4 : Symbol(tt4, Decl(variadicTuples2.ts, 78, 3))
>tt3 : Symbol(tt3, Decl(variadicTuples2.ts, 77, 11))
>tt4 : Symbol(tt4, Decl(variadicTuples2.ts, 83, 3))
>tt3 : Symbol(tt3, Decl(variadicTuples2.ts, 82, 11))
// Inference
function pipe<T extends readonly unknown[]>(...args: [...T, (...values: T) => void]) {
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 78, 36))
>T : Symbol(T, Decl(variadicTuples2.ts, 82, 14))
>args : Symbol(args, Decl(variadicTuples2.ts, 82, 44))
>T : Symbol(T, Decl(variadicTuples2.ts, 82, 14))
>values : Symbol(values, Decl(variadicTuples2.ts, 82, 61))
>T : Symbol(T, Decl(variadicTuples2.ts, 82, 14))
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 83, 36))
>T : Symbol(T, Decl(variadicTuples2.ts, 87, 14))
>args : Symbol(args, Decl(variadicTuples2.ts, 87, 44))
>T : Symbol(T, Decl(variadicTuples2.ts, 87, 14))
>values : Symbol(values, Decl(variadicTuples2.ts, 87, 61))
>T : Symbol(T, Decl(variadicTuples2.ts, 87, 14))
const callback = args[args.length - 1] as (...values: T) => void;
>callback : Symbol(callback, Decl(variadicTuples2.ts, 83, 9))
>args : Symbol(args, Decl(variadicTuples2.ts, 82, 44))
>callback : Symbol(callback, Decl(variadicTuples2.ts, 88, 9))
>args : Symbol(args, Decl(variadicTuples2.ts, 87, 44))
>args.length : Symbol(length)
>args : Symbol(args, Decl(variadicTuples2.ts, 82, 44))
>args : Symbol(args, Decl(variadicTuples2.ts, 87, 44))
>length : Symbol(length)
>values : Symbol(values, Decl(variadicTuples2.ts, 83, 47))
>T : Symbol(T, Decl(variadicTuples2.ts, 82, 14))
>values : Symbol(values, Decl(variadicTuples2.ts, 88, 47))
>T : Symbol(T, Decl(variadicTuples2.ts, 87, 14))
const values = args.slice(0, -1) as unknown as T;
>values : Symbol(values, Decl(variadicTuples2.ts, 84, 9))
>values : Symbol(values, Decl(variadicTuples2.ts, 89, 9))
>args.slice : Symbol(Array.slice, Decl(lib.es5.d.ts, --, --))
>args : Symbol(args, Decl(variadicTuples2.ts, 82, 44))
>args : Symbol(args, Decl(variadicTuples2.ts, 87, 44))
>slice : Symbol(Array.slice, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(variadicTuples2.ts, 82, 14))
>T : Symbol(T, Decl(variadicTuples2.ts, 87, 14))
callback(...values);
>callback : Symbol(callback, Decl(variadicTuples2.ts, 83, 9))
>values : Symbol(values, Decl(variadicTuples2.ts, 84, 9))
>callback : Symbol(callback, Decl(variadicTuples2.ts, 88, 9))
>values : Symbol(values, Decl(variadicTuples2.ts, 89, 9))
}
pipe("foo", 123, true, (a, b, c) => {
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 78, 36))
>a : Symbol(a, Decl(variadicTuples2.ts, 88, 24))
>b : Symbol(b, Decl(variadicTuples2.ts, 88, 26))
>c : Symbol(c, Decl(variadicTuples2.ts, 88, 29))
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 83, 36))
>a : Symbol(a, Decl(variadicTuples2.ts, 93, 24))
>b : Symbol(b, Decl(variadicTuples2.ts, 93, 26))
>c : Symbol(c, Decl(variadicTuples2.ts, 93, 29))
a; // string
>a : Symbol(a, Decl(variadicTuples2.ts, 88, 24))
>a : Symbol(a, Decl(variadicTuples2.ts, 93, 24))
b; // number
>b : Symbol(b, Decl(variadicTuples2.ts, 88, 26))
>b : Symbol(b, Decl(variadicTuples2.ts, 93, 26))
c; // boolean
>c : Symbol(c, Decl(variadicTuples2.ts, 88, 29))
>c : Symbol(c, Decl(variadicTuples2.ts, 93, 29))
})
pipe("foo", 123, true, (...x) => {
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 78, 36))
>x : Symbol(x, Decl(variadicTuples2.ts, 94, 24))
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 83, 36))
>x : Symbol(x, Decl(variadicTuples2.ts, 99, 24))
x; // [string, number, boolean]
>x : Symbol(x, Decl(variadicTuples2.ts, 94, 24))
>x : Symbol(x, Decl(variadicTuples2.ts, 99, 24))
});
declare const sa: string[];
>sa : Symbol(sa, Decl(variadicTuples2.ts, 98, 13))
>sa : Symbol(sa, Decl(variadicTuples2.ts, 103, 13))
pipe(...sa, (...x) => {
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 78, 36))
>sa : Symbol(sa, Decl(variadicTuples2.ts, 98, 13))
>x : Symbol(x, Decl(variadicTuples2.ts, 100, 13))
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 83, 36))
>sa : Symbol(sa, Decl(variadicTuples2.ts, 103, 13))
>x : Symbol(x, Decl(variadicTuples2.ts, 105, 13))
x; // string[]
>x : Symbol(x, Decl(variadicTuples2.ts, 100, 13))
>x : Symbol(x, Decl(variadicTuples2.ts, 105, 13))
});
pipe(1, ...sa, 2, (...x) => {
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 78, 36))
>sa : Symbol(sa, Decl(variadicTuples2.ts, 98, 13))
>x : Symbol(x, Decl(variadicTuples2.ts, 104, 19))
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 83, 36))
>sa : Symbol(sa, Decl(variadicTuples2.ts, 103, 13))
>x : Symbol(x, Decl(variadicTuples2.ts, 109, 19))
x; // [number, ...string[], number]
>x : Symbol(x, Decl(variadicTuples2.ts, 104, 19))
>x : Symbol(x, Decl(variadicTuples2.ts, 109, 19))
let qq = x[x.length - 1];
>qq : Symbol(qq, Decl(variadicTuples2.ts, 106, 7))
>x : Symbol(x, Decl(variadicTuples2.ts, 104, 19))
>qq : Symbol(qq, Decl(variadicTuples2.ts, 111, 7))
>x : Symbol(x, Decl(variadicTuples2.ts, 109, 19))
>x.length : Symbol(length)
>x : Symbol(x, Decl(variadicTuples2.ts, 104, 19))
>x : Symbol(x, Decl(variadicTuples2.ts, 109, 19))
>length : Symbol(length)
let ww = x[0]
>ww : Symbol(ww, Decl(variadicTuples2.ts, 107, 7))
>x : Symbol(x, Decl(variadicTuples2.ts, 104, 19))
>ww : Symbol(ww, Decl(variadicTuples2.ts, 112, 7))
>x : Symbol(x, Decl(variadicTuples2.ts, 109, 19))
>0 : Symbol(0)
});
pipe<number[]>(1, 2, 3, 4); // Error
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 78, 36))
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 83, 36))
pipe(...sa); // Error
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 78, 36))
>sa : Symbol(sa, Decl(variadicTuples2.ts, 98, 13))
>pipe : Symbol(pipe, Decl(variadicTuples2.ts, 83, 36))
>sa : Symbol(sa, Decl(variadicTuples2.ts, 103, 13))
declare function fn1<T, U>(t: [...unknown[], T, U]): [T, U];
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 111, 12))
>T : Symbol(T, Decl(variadicTuples2.ts, 113, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 113, 23))
>t : Symbol(t, Decl(variadicTuples2.ts, 113, 27))
>T : Symbol(T, Decl(variadicTuples2.ts, 113, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 113, 23))
>T : Symbol(T, Decl(variadicTuples2.ts, 113, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 113, 23))
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 116, 12))
>T : Symbol(T, Decl(variadicTuples2.ts, 118, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 118, 23))
>t : Symbol(t, Decl(variadicTuples2.ts, 118, 27))
>T : Symbol(T, Decl(variadicTuples2.ts, 118, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 118, 23))
>T : Symbol(T, Decl(variadicTuples2.ts, 118, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 118, 23))
fn1([]); // Error
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 111, 12))
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 116, 12))
fn1([1]); // Error
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 111, 12))
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 116, 12))
fn1([1, 'abc']); // [number, string]
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 111, 12))
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 116, 12))
fn1([1, 'abc', true]); // [string, boolean]
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 111, 12))
>fn1 : Symbol(fn1, Decl(variadicTuples2.ts, 116, 12))
declare function fn2<T, U>(t: [T, ...unknown[], U]): [T, U];
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 117, 22))
>T : Symbol(T, Decl(variadicTuples2.ts, 119, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 119, 23))
>t : Symbol(t, Decl(variadicTuples2.ts, 119, 27))
>T : Symbol(T, Decl(variadicTuples2.ts, 119, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 119, 23))
>T : Symbol(T, Decl(variadicTuples2.ts, 119, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 119, 23))
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 122, 22))
>T : Symbol(T, Decl(variadicTuples2.ts, 124, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 124, 23))
>t : Symbol(t, Decl(variadicTuples2.ts, 124, 27))
>T : Symbol(T, Decl(variadicTuples2.ts, 124, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 124, 23))
>T : Symbol(T, Decl(variadicTuples2.ts, 124, 21))
>U : Symbol(U, Decl(variadicTuples2.ts, 124, 23))
fn2([]); // Error
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 117, 22))
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 122, 22))
fn2([1]); // Error
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 117, 22))
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 122, 22))
fn2([1, 'abc']); // [number, string]
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 117, 22))
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 122, 22))
fn2([1, 'abc', true]); // [number, boolean]
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 117, 22))
>fn2 : Symbol(fn2, Decl(variadicTuples2.ts, 122, 22))
// Repro from #39595
declare function foo<S extends readonly [string, ...string[]]>(...stringsAndNumber: readonly [...S, number]): [...S, number];
>foo : Symbol(foo, Decl(variadicTuples2.ts, 123, 22))
>S : Symbol(S, Decl(variadicTuples2.ts, 127, 21))
>stringsAndNumber : Symbol(stringsAndNumber, Decl(variadicTuples2.ts, 127, 63))
>S : Symbol(S, Decl(variadicTuples2.ts, 127, 21))
>S : Symbol(S, Decl(variadicTuples2.ts, 127, 21))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 128, 22))
>S : Symbol(S, Decl(variadicTuples2.ts, 132, 21))
>stringsAndNumber : Symbol(stringsAndNumber, Decl(variadicTuples2.ts, 132, 63))
>S : Symbol(S, Decl(variadicTuples2.ts, 132, 21))
>S : Symbol(S, Decl(variadicTuples2.ts, 132, 21))
const a1 = foo('blah1', 1);
>a1 : Symbol(a1, Decl(variadicTuples2.ts, 129, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 123, 22))
>a1 : Symbol(a1, Decl(variadicTuples2.ts, 134, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 128, 22))
const b1 = foo('blah1', 'blah2', 1);
>b1 : Symbol(b1, Decl(variadicTuples2.ts, 130, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 123, 22))
>b1 : Symbol(b1, Decl(variadicTuples2.ts, 135, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 128, 22))
const c1 = foo(1); // Error
>c1 : Symbol(c1, Decl(variadicTuples2.ts, 131, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 123, 22))
>c1 : Symbol(c1, Decl(variadicTuples2.ts, 136, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 128, 22))
const d1 = foo(1, 2); // Error
>d1 : Symbol(d1, Decl(variadicTuples2.ts, 132, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 123, 22))
>d1 : Symbol(d1, Decl(variadicTuples2.ts, 137, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 128, 22))
const e1 = foo('blah1', 'blah2', 1, 2, 3); // Error
>e1 : Symbol(e1, Decl(variadicTuples2.ts, 133, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 123, 22))
>e1 : Symbol(e1, Decl(variadicTuples2.ts, 138, 5))
>foo : Symbol(foo, Decl(variadicTuples2.ts, 128, 22))

View File

@ -21,6 +21,18 @@ type V11 = [number, ...string[], boolean?]; // Error
type V12 = [number, string?, boolean]; // Error
>V12 : [number, (string | undefined)?, boolean]
type V15 = [...string[], ...number[]]; // Error
>V15 : [...string[], ...number[]]
type V16 = [...string[], ...Array<number>]; // Error
>V16 : (string | number)[]
type V17 = [...Array<string>, ...number[]]; // Error
>V17 : (string | number)[]
type V18 = [...Array<string>, ...Array<number>]; // Error
>V18 : (string | number)[]
// Normalization
type Tup3<T extends unknown[], U extends unknown[], V extends unknown[]> = [...T, ...U, ...V];

View File

@ -0,0 +1,45 @@
// @strict: true
// @noEmit: true
// Property keys are `number` following the fixed part of a tuple
type K<T> = { [P in keyof T]: P };
type M<T> = { [P in keyof T]: T[P] };
type KA = K<[string, string, boolean]>; // ["0", "1", "2"]
type KB = K<[string, string, ...string[], string]>; // ["0", "1", ...number[], number]
type KC = K<[...string[]]>; // number[]
type KD = K<string[]>; // number[]
type A = { a: string };
type B = { b: string };
type C = { c: string };
type D = { d: string };
type V0<T extends unknown[]> = [A, B?, ...T, ...C[]]
type V1<T extends unknown[]> = [A, ...T, B, ...C[], D]
type K0<T extends unknown[]> = K<V0<T>>; // ["0", "1"?, ...K<T>, ...number[]]
type K1<T extends unknown[]> = K<V1<T>>; // ["0", ...K<T>, number, ...number[], number]
type M0<T extends unknown[]> = M<V0<T>>; // [A, B?, ...M<T>, ...C[]]
type M1<T extends unknown[]> = M<V1<T>>; // [A, ...M<T>, B, ...C[], D]
// Repro from #48856
type Keys<O extends unknown[]> = { [K in keyof O]: K };
type Keys1 = Keys<[string, ...string[]]>;
type Keys2 = Keys<[string, ...string[], number]>;
// Repro from #56888
type T1 = ['a', 'b', 'c'] extends readonly [infer H, ...unknown[]] ? H : never; // "a"
type T2 = ['a', 'b', 'c'] extends Readonly<[infer H, ...unknown[]]> ? H : never; // "a"
type T3 = ['a', 'b', 'c'] extends readonly [...unknown[], infer L] ? L : never; // "c"
type T4 = ['a', 'b', 'c'] extends Readonly<[...unknown[], infer L]> ? L : never; // "c"
// Repro from #56888
type R1<T> = readonly [...unknown[], T]; // readonly [...unknown[], T]
type R2<T> = Readonly<[...unknown[], T]>; // readonly [...unknown[], T]

View File

@ -11,6 +11,11 @@ type V10 = [number, ...string[], ...boolean[]]; // Error
type V11 = [number, ...string[], boolean?]; // Error
type V12 = [number, string?, boolean]; // Error
type V15 = [...string[], ...number[]]; // Error
type V16 = [...string[], ...Array<number>]; // Error
type V17 = [...Array<string>, ...number[]]; // Error
type V18 = [...Array<string>, ...Array<number>]; // Error
// Normalization
type Tup3<T extends unknown[], U extends unknown[], V extends unknown[]> = [...T, ...U, ...V];