Fixed display of optional and rest parameters created as result of combining union parameters (#55625)

This commit is contained in:
Mateusz Burzyński 2023-09-13 20:25:19 +02:00 committed by GitHub
parent 3f0c62bf02
commit 543d7ed00c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 141 additions and 10 deletions

View File

@ -13202,12 +13202,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
const paramSymbol = createSymbol(
SymbolFlags.FunctionScopedVariable | (isOptional && !isRestParam ? SymbolFlags.Optional : 0),
paramName || `arg${i}` as __String,
isRestParam ? CheckFlags.RestParameter : isOptional ? CheckFlags.OptionalParameter : 0,
);
paramSymbol.links.type = isRestParam ? createArrayType(unionParamType) : unionParamType;
params[i] = paramSymbol;
}
if (needsExtraRestElement) {
const restParamSymbol = createSymbol(SymbolFlags.FunctionScopedVariable, "args" as __String);
const restParamSymbol = createSymbol(SymbolFlags.FunctionScopedVariable, "args" as __String, CheckFlags.RestParameter);
restParamSymbol.links.type = createArrayType(getTypeAtPosition(shorter, longestCount));
if (shorter === right) {
restParamSymbol.links.type = instantiateType(restParamSymbol.links.type, mapper);

View File

@ -6,25 +6,25 @@
// | (method) Array<T>.concat(...items: ConcatArray<string | number>[]): (string | number)[] (+1 overload)
// | (method) Array<T>.every<S>(predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is S[] (+1 overload)
// | (method) Array<T>.filter<S>(predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): S[] (+1 overload)
// | (method) Array<T>.forEach(callbackfn: ((value: string, index: number, array: string[]) => void) & ((value: number, index: number, array: number[]) => void), thisArg: any): void
// | (method) Array<T>.indexOf(searchElement: never, fromIndex: number): number
// | (method) Array<T>.forEach(callbackfn: ((value: string, index: number, array: string[]) => void) & ((value: number, index: number, array: number[]) => void), thisArg?: any): void
// | (method) Array<T>.indexOf(searchElement: never, fromIndex?: number): number
// | (method) Array<T>.join(separator?: string): string
// | (method) Array<T>.lastIndexOf(searchElement: never, fromIndex: number): number
// | (method) Array<T>.lastIndexOf(searchElement: never, fromIndex?: number): number
// | (property) Array<T>.length: number
// | (method) Array<T>.map<unknown>(callbackfn: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg: any): unknown[]
// | (method) Array<T>.map<unknown>(callbackfn: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg?: any): unknown[]
// | (method) Array<T>.pop(): string | number
// | (method) Array<T>.push(items: never[]): number
// | (method) Array<T>.push(...items: never[]): number
// | (method) Array<T>.reduce(callbackfn: (previousValue: string | number, currentValue: string | number, currentIndex: number, array: (string | number)[]) => string | number): string | number (+2 overloads)
// | (method) Array<T>.reduceRight(callbackfn: (previousValue: string | number, currentValue: string | number, currentIndex: number, array: (string | number)[]) => string | number): string | number (+2 overloads)
// | (method) Array<T>.reverse(): string[] | number[]
// | (method) Array<T>.shift(): string | number
// | (method) Array<T>.slice(start?: number, end?: number): string[] | number[]
// | (method) Array<T>.some(predicate: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg: any): boolean
// | (method) Array<T>.sort(compareFn: ((a: string, b: string) => number) & ((a: number, b: number) => number)): string[] | number[]
// | (method) Array<T>.some(predicate: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg?: any): boolean
// | (method) Array<T>.sort(compareFn?: ((a: string, b: string) => number) & ((a: number, b: number) => number)): string[] | number[]
// | (method) Array<T>.splice(start: number, deleteCount?: number): string[] | number[] (+2 overloads)
// | (method) Array<T>.toLocaleString(): string
// | (method) Array<T>.toString(): string
// | (method) Array<T>.unshift(items: never[]): number
// | (method) Array<T>.unshift(...items: never[]): number
// | ----------------------------------------------------------------------
[
@ -1263,6 +1263,10 @@
"text": "thisArg",
"kind": "parameterName"
},
{
"text": "?",
"kind": "punctuation"
},
{
"text": ":",
"kind": "punctuation"
@ -1413,6 +1417,10 @@
"text": "fromIndex",
"kind": "parameterName"
},
{
"text": "?",
"kind": "punctuation"
},
{
"text": ":",
"kind": "punctuation"
@ -1676,6 +1684,10 @@
"text": "fromIndex",
"kind": "parameterName"
},
{
"text": "?",
"kind": "punctuation"
},
{
"text": ":",
"kind": "punctuation"
@ -2120,6 +2132,10 @@
"text": "thisArg",
"kind": "parameterName"
},
{
"text": "?",
"kind": "punctuation"
},
{
"text": ":",
"kind": "punctuation"
@ -2340,6 +2356,10 @@
"text": "(",
"kind": "punctuation"
},
{
"text": "...",
"kind": "punctuation"
},
{
"text": "items",
"kind": "parameterName"
@ -3803,6 +3823,10 @@
"text": "thisArg",
"kind": "parameterName"
},
{
"text": "?",
"kind": "punctuation"
},
{
"text": ":",
"kind": "punctuation"
@ -3929,6 +3953,10 @@
"text": "compareFn",
"kind": "parameterName"
},
{
"text": "?",
"kind": "punctuation"
},
{
"text": ":",
"kind": "punctuation"
@ -4589,6 +4617,10 @@
"text": "(",
"kind": "punctuation"
},
{
"text": "...",
"kind": "punctuation"
},
{
"text": "items",
"kind": "parameterName"

View File

@ -3,7 +3,7 @@
////var y: Array<string>|Array<number>;
////y.map/**/(
const text = "(method) Array<T>.map<unknown>(callbackfn: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg: any): unknown[]";
const text = "(method) Array<T>.map<unknown>(callbackfn: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg?: any): unknown[]";
const documentation = "Calls a defined callback function on each element of an array, and returns an array that contains the results.";
verify.quickInfoAt("", text, documentation);

View File

@ -0,0 +1,18 @@
/// <reference path='fourslash.ts'/>
// https://github.com/microsoft/TypeScript/issues/55574
//// declare const optionals:
//// | ((a?: { a: true }) => unknown)
//// | ((b?: { b: true }) => unknown);
////
//// /**/optionals();
verify.quickInfoAt(
"",
`const optionals: (arg0?: {
a: true;
} & {
b: true;
}) => unknown`,
);

View File

@ -0,0 +1,18 @@
/// <reference path='fourslash.ts'/>
// based on https://github.com/microsoft/TypeScript/issues/55574
//// declare const rest:
//// | ((v: { a: true }, ...rest: string[]) => unknown)
//// | ((v: { b: true }) => unknown);
////
//// /**/rest({ a: true, b: true }, "foo", "bar");
verify.quickInfoAt(
"",
`const rest: (v: {
a: true;
} & {
b: true;
}, ...rest: string[]) => unknown`,
);

View File

@ -0,0 +1,18 @@
/// <reference path='fourslash.ts'/>
// https://github.com/microsoft/TypeScript/issues/55574
//// declare const rest:
//// | ((a?: { a: true }, ...rest: string[]) => unknown)
//// | ((b?: { b: true }) => unknown);
////
//// /**/rest({ a: true, b: true }, "foo", "bar");
verify.quickInfoAt(
"",
`const rest: (arg0?: {
a: true;
} & {
b: true;
}, ...rest: string[]) => unknown`,
);

View File

@ -0,0 +1,22 @@
/// <reference path='fourslash.ts'/>
//// declare const fn:
//// | ((a: { x: number }, b: { x: number }) => number)
//// | ((...a: { y: number }[]) => number);
////
//// /**/fn();
verify.quickInfoAt(
"",
`const fn: (a: {
x: number;
} & {
y: number;
}, b: {
x: number;
} & {
y: number;
}, ...args: {
y: number;
}[]) => number`,
);

View File

@ -0,0 +1,22 @@
/// <reference path='fourslash.ts'/>
//// declare const fn:
//// | ((a?: { x: number }, b?: { x: number }) => number)
//// | ((...a: { y: number }[]) => number);
////
//// /**/fn();
verify.quickInfoAt(
"",
`const fn: (a?: {
x: number;
} & {
y: number;
}, b?: {
x: number;
} & {
y: number;
}, ...args: {
y: number;
}[]) => number`,
);