Preserve partially typed tuple names in more places (#55789)

This commit is contained in:
Jake Bailey 2023-10-04 13:45:25 -07:00 committed by GitHub
parent 758884c093
commit 579e494f01
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 61 additions and 10 deletions

View File

@ -33356,8 +33356,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 {
@ -35741,12 +35744,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

View File

@ -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[]]'.
};

View File

@ -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);

View File

@ -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))

View File

@ -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]

View File

@ -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

View File

@ -0,0 +1,6 @@
// @strict: true
// @lib: esnext
declare const tuple: [number, name: string, boolean, value: number, string];
const output = ((...args) => args)(...tuple);