mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-14 10:55:15 -06:00
Merge pull request #15849 from Microsoft/allow-spread-after-required-params
Allow spreading arrays after required parameters
This commit is contained in:
commit
fc306ba641
@ -14760,7 +14760,7 @@ namespace ts {
|
||||
// If spread arguments are present, check that they correspond to a rest parameter. If so, no
|
||||
// further checking is necessary.
|
||||
if (spreadArgIndex >= 0) {
|
||||
return isRestParameterIndex(signature, spreadArgIndex);
|
||||
return isRestParameterIndex(signature, spreadArgIndex) || spreadArgIndex >= signature.minArgumentCount;
|
||||
}
|
||||
|
||||
// Too many arguments implies incorrect arity.
|
||||
|
||||
81
tests/baselines/reference/callWithSpread2.errors.txt
Normal file
81
tests/baselines/reference/callWithSpread2.errors.txt
Normal file
@ -0,0 +1,81 @@
|
||||
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(30,5): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(31,5): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(32,13): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(33,13): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(34,11): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(35,11): error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(36,1): error TS2346: Supplied parameters do not match any signature of call target.
|
||||
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(37,1): error TS2346: Supplied parameters do not match any signature of call target.
|
||||
tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts(38,1): error TS2346: Supplied parameters do not match any signature of call target.
|
||||
|
||||
|
||||
==== tests/cases/conformance/expressions/functionCalls/callWithSpread2.ts (9 errors) ====
|
||||
declare function all(a?: number, b?: number): void;
|
||||
declare function weird(a?: number | string, b?: number | string): void;
|
||||
declare function prefix(s: string, a?: number, b?: number): void;
|
||||
declare function rest(s: string, a?: number, b?: number, ...rest: number[]): void;
|
||||
declare function normal(s: string): void;
|
||||
declare function thunk(): string;
|
||||
|
||||
declare var ns: number[];
|
||||
declare var mixed: (number | string)[];
|
||||
declare var tuple: [number, string];
|
||||
|
||||
// good
|
||||
all(...ns)
|
||||
weird(...ns)
|
||||
weird(...mixed)
|
||||
weird(...tuple)
|
||||
prefix("a", ...ns)
|
||||
rest("d", ...ns)
|
||||
|
||||
|
||||
// this covers the arguments case
|
||||
normal("g", ...ns)
|
||||
normal("h", ...mixed)
|
||||
normal("i", ...tuple)
|
||||
thunk(...ns)
|
||||
thunk(...mixed)
|
||||
thunk(...tuple)
|
||||
|
||||
// bad
|
||||
all(...mixed)
|
||||
~~~~~~~~
|
||||
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
!!! error TS2345: Type 'string' is not assignable to type 'number'.
|
||||
all(...tuple)
|
||||
~~~~~~~~
|
||||
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
!!! error TS2345: Type 'string' is not assignable to type 'number'.
|
||||
prefix("b", ...mixed)
|
||||
~~~~~~~~
|
||||
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
!!! error TS2345: Type 'string' is not assignable to type 'number'.
|
||||
prefix("c", ...tuple)
|
||||
~~~~~~~~
|
||||
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
!!! error TS2345: Type 'string' is not assignable to type 'number'.
|
||||
rest("e", ...mixed)
|
||||
~~~~~~~~
|
||||
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
!!! error TS2345: Type 'string' is not assignable to type 'number'.
|
||||
rest("f", ...tuple)
|
||||
~~~~~~~~
|
||||
!!! error TS2345: Argument of type 'string | number' is not assignable to parameter of type 'number'.
|
||||
!!! error TS2345: Type 'string' is not assignable to type 'number'.
|
||||
prefix(...ns) // required parameters are required
|
||||
~~~~~~~~~~~~~
|
||||
!!! error TS2346: Supplied parameters do not match any signature of call target.
|
||||
prefix(...mixed)
|
||||
~~~~~~~~~~~~~~~~
|
||||
!!! error TS2346: Supplied parameters do not match any signature of call target.
|
||||
prefix(...tuple)
|
||||
~~~~~~~~~~~~~~~~
|
||||
!!! error TS2346: Supplied parameters do not match any signature of call target.
|
||||
|
||||
66
tests/baselines/reference/callWithSpread2.js
Normal file
66
tests/baselines/reference/callWithSpread2.js
Normal file
@ -0,0 +1,66 @@
|
||||
//// [callWithSpread2.ts]
|
||||
declare function all(a?: number, b?: number): void;
|
||||
declare function weird(a?: number | string, b?: number | string): void;
|
||||
declare function prefix(s: string, a?: number, b?: number): void;
|
||||
declare function rest(s: string, a?: number, b?: number, ...rest: number[]): void;
|
||||
declare function normal(s: string): void;
|
||||
declare function thunk(): string;
|
||||
|
||||
declare var ns: number[];
|
||||
declare var mixed: (number | string)[];
|
||||
declare var tuple: [number, string];
|
||||
|
||||
// good
|
||||
all(...ns)
|
||||
weird(...ns)
|
||||
weird(...mixed)
|
||||
weird(...tuple)
|
||||
prefix("a", ...ns)
|
||||
rest("d", ...ns)
|
||||
|
||||
|
||||
// this covers the arguments case
|
||||
normal("g", ...ns)
|
||||
normal("h", ...mixed)
|
||||
normal("i", ...tuple)
|
||||
thunk(...ns)
|
||||
thunk(...mixed)
|
||||
thunk(...tuple)
|
||||
|
||||
// bad
|
||||
all(...mixed)
|
||||
all(...tuple)
|
||||
prefix("b", ...mixed)
|
||||
prefix("c", ...tuple)
|
||||
rest("e", ...mixed)
|
||||
rest("f", ...tuple)
|
||||
prefix(...ns) // required parameters are required
|
||||
prefix(...mixed)
|
||||
prefix(...tuple)
|
||||
|
||||
|
||||
//// [callWithSpread2.js]
|
||||
// good
|
||||
all.apply(void 0, ns);
|
||||
weird.apply(void 0, ns);
|
||||
weird.apply(void 0, mixed);
|
||||
weird.apply(void 0, tuple);
|
||||
prefix.apply(void 0, ["a"].concat(ns));
|
||||
rest.apply(void 0, ["d"].concat(ns));
|
||||
// this covers the arguments case
|
||||
normal.apply(void 0, ["g"].concat(ns));
|
||||
normal.apply(void 0, ["h"].concat(mixed));
|
||||
normal.apply(void 0, ["i"].concat(tuple));
|
||||
thunk.apply(void 0, ns);
|
||||
thunk.apply(void 0, mixed);
|
||||
thunk.apply(void 0, tuple);
|
||||
// bad
|
||||
all.apply(void 0, mixed);
|
||||
all.apply(void 0, tuple);
|
||||
prefix.apply(void 0, ["b"].concat(mixed));
|
||||
prefix.apply(void 0, ["c"].concat(tuple));
|
||||
rest.apply(void 0, ["e"].concat(mixed));
|
||||
rest.apply(void 0, ["f"].concat(tuple));
|
||||
prefix.apply(void 0, ns); // required parameters are required
|
||||
prefix.apply(void 0, mixed);
|
||||
prefix.apply(void 0, tuple);
|
||||
@ -0,0 +1,38 @@
|
||||
declare function all(a?: number, b?: number): void;
|
||||
declare function weird(a?: number | string, b?: number | string): void;
|
||||
declare function prefix(s: string, a?: number, b?: number): void;
|
||||
declare function rest(s: string, a?: number, b?: number, ...rest: number[]): void;
|
||||
declare function normal(s: string): void;
|
||||
declare function thunk(): string;
|
||||
|
||||
declare var ns: number[];
|
||||
declare var mixed: (number | string)[];
|
||||
declare var tuple: [number, string];
|
||||
|
||||
// good
|
||||
all(...ns)
|
||||
weird(...ns)
|
||||
weird(...mixed)
|
||||
weird(...tuple)
|
||||
prefix("a", ...ns)
|
||||
rest("d", ...ns)
|
||||
|
||||
|
||||
// this covers the arguments case
|
||||
normal("g", ...ns)
|
||||
normal("h", ...mixed)
|
||||
normal("i", ...tuple)
|
||||
thunk(...ns)
|
||||
thunk(...mixed)
|
||||
thunk(...tuple)
|
||||
|
||||
// bad
|
||||
all(...mixed)
|
||||
all(...tuple)
|
||||
prefix("b", ...mixed)
|
||||
prefix("c", ...tuple)
|
||||
rest("e", ...mixed)
|
||||
rest("f", ...tuple)
|
||||
prefix(...ns) // required parameters are required
|
||||
prefix(...mixed)
|
||||
prefix(...tuple)
|
||||
Loading…
x
Reference in New Issue
Block a user