diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fae333d4a824c..f1fde64dd3bec 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -33235,8 +33235,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (arg.kind === SyntaxKind.SyntheticExpression && (arg as SyntheticExpression).tupleNameSource) { names.push((arg as SyntheticExpression).tupleNameSource!); } + else { + names.push(undefined); + } } - return createTupleType(types, flags, inConstContext && !someType(restType, isMutableArrayLikeType), length(names) === length(types) ? names : undefined); + return createTupleType(types, flags, inConstContext && !someType(restType, isMutableArrayLikeType), names); } function checkTypeArguments(signature: Signature, typeArgumentNodes: readonly TypeNode[], reportErrors: boolean, headMessage?: DiagnosticMessage): Type[] | undefined { @@ -35571,12 +35574,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { types.push(restType); flags.push(ElementFlags.Variadic); } - const name = getNameableDeclarationAtPosition(source, i); - if (name) { - names.push(name); - } + names.push(getNameableDeclarationAtPosition(source, i)); } - return createTupleType(types, flags, readonly, length(names) === length(types) ? names : undefined); + return createTupleType(types, flags, readonly, names); } // Return the number of parameters in a signature. The rest parameter, if present, counts as one diff --git a/tests/baselines/reference/argumentsReferenceInFunction1_Js.errors.txt b/tests/baselines/reference/argumentsReferenceInFunction1_Js.errors.txt index 507a3f5639249..9d55aafa33e31 100644 --- a/tests/baselines/reference/argumentsReferenceInFunction1_Js.errors.txt +++ b/tests/baselines/reference/argumentsReferenceInFunction1_Js.errors.txt @@ -1,5 +1,5 @@ index.js(1,25): error TS7006: Parameter 'f' implicitly has an 'any' type. -index.js(13,29): error TS2345: Argument of type 'IArguments' is not assignable to parameter of type '[any?, ...any[]]'. +index.js(13,29): error TS2345: Argument of type 'IArguments' is not assignable to parameter of type '[f?: any, ...any[]]'. ==== index.js (2 errors) ==== @@ -19,6 +19,6 @@ index.js(13,29): error TS2345: Argument of type 'IArguments' is not assignable t const debuglog = function() { return format.apply(null, arguments); ~~~~~~~~~ -!!! error TS2345: Argument of type 'IArguments' is not assignable to parameter of type '[any?, ...any[]]'. +!!! error TS2345: Argument of type 'IArguments' is not assignable to parameter of type '[f?: any, ...any[]]'. }; \ No newline at end of file diff --git a/tests/baselines/reference/partiallyNamedTuples3.js b/tests/baselines/reference/partiallyNamedTuples3.js new file mode 100644 index 0000000000000..36d639391a5de --- /dev/null +++ b/tests/baselines/reference/partiallyNamedTuples3.js @@ -0,0 +1,17 @@ +//// [tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts] //// + +//// [partiallyNamedTuples3.ts] +declare const tuple: [number, name: string, boolean, value: number, string]; + +const output = ((...args) => args)(...tuple); + + +//// [partiallyNamedTuples3.js] +"use strict"; +var output = (function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return args; +}).apply(void 0, tuple); diff --git a/tests/baselines/reference/partiallyNamedTuples3.symbols b/tests/baselines/reference/partiallyNamedTuples3.symbols new file mode 100644 index 0000000000000..9a73d914ddc94 --- /dev/null +++ b/tests/baselines/reference/partiallyNamedTuples3.symbols @@ -0,0 +1,12 @@ +//// [tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts] //// + +=== partiallyNamedTuples3.ts === +declare const tuple: [number, name: string, boolean, value: number, string]; +>tuple : Symbol(tuple, Decl(partiallyNamedTuples3.ts, 0, 13)) + +const output = ((...args) => args)(...tuple); +>output : Symbol(output, Decl(partiallyNamedTuples3.ts, 2, 5)) +>args : Symbol(args, Decl(partiallyNamedTuples3.ts, 2, 17)) +>args : Symbol(args, Decl(partiallyNamedTuples3.ts, 2, 17)) +>tuple : Symbol(tuple, Decl(partiallyNamedTuples3.ts, 0, 13)) + diff --git a/tests/baselines/reference/partiallyNamedTuples3.types b/tests/baselines/reference/partiallyNamedTuples3.types new file mode 100644 index 0000000000000..91da7e460d788 --- /dev/null +++ b/tests/baselines/reference/partiallyNamedTuples3.types @@ -0,0 +1,16 @@ +//// [tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts] //// + +=== partiallyNamedTuples3.ts === +declare const tuple: [number, name: string, boolean, value: number, string]; +>tuple : [number, name: string, boolean, value: number, string] + +const output = ((...args) => args)(...tuple); +>output : [number, name: string, boolean, value: number, string] +>((...args) => args)(...tuple) : [number, name: string, boolean, value: number, string] +>((...args) => args) : (args_0: number, name: string, args_2: boolean, value: number, args_4: string) => [number, name: string, boolean, value: number, string] +>(...args) => args : (args_0: number, name: string, args_2: boolean, value: number, args_4: string) => [number, name: string, boolean, value: number, string] +>args : [number, name: string, boolean, value: number, string] +>args : [number, name: string, boolean, value: number, string] +>...tuple : string | number | boolean +>tuple : [number, name: string, boolean, value: number, string] + diff --git a/tests/baselines/reference/restTuplesFromContextualTypes.types b/tests/baselines/reference/restTuplesFromContextualTypes.types index d80a1124a0f1c..a9de22bade988 100644 --- a/tests/baselines/reference/restTuplesFromContextualTypes.types +++ b/tests/baselines/reference/restTuplesFromContextualTypes.types @@ -265,8 +265,8 @@ f3((a, b, c) => {}) f3((...x) => {}) >f3((...x) => {}) : void >f3 : (cb: (x: number, args_0: boolean, ...args_1: string[]) => void) => void ->(...x) => {} : (x_0: number, x_1: boolean, ...x_2: string[]) => void ->x : [number, boolean, ...string[]] +>(...x) => {} : (x: number, x_1: boolean, ...x_2: string[]) => void +>x : [x: number, boolean, ...string[]] f3((a, ...x) => {}) >f3((a, ...x) => {}) : void diff --git a/tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts b/tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts new file mode 100644 index 0000000000000..14ac6b03a7dfc --- /dev/null +++ b/tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts @@ -0,0 +1,6 @@ +// @strict: true +// @lib: esnext + +declare const tuple: [number, name: string, boolean, value: number, string]; + +const output = ((...args) => args)(...tuple);