-
Notifications
You must be signed in to change notification settings - Fork 12.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rest elements in generic tuple #26113
Comments
Interstingly, adding angled brackets works (but requires an array of arrays following the number): interface Foo<ArgsT extends any[]> {
arr: ArgsT;
}
interface Bar<SubArgsT extends any[]> extends Foo<[number, ...SubArgsT[]]>{ }
var f: Foo<number[]> = {
arr: [1,2,3],
};
var b1: Bar<string[]> = {
arr: [1, [""], ["1", "2"]], // not what OP meant, but it works
}
var b2: Bar<string[]> = {
arr: [1, "", "1", "2"], // error: [number, string, string] cannot be assigned to [number, ...string[][]]
} And this correctly captures the type OP wants to create type Fooify<SubArgsT extends any[]> =
((arg1: number, ...rest: SubArgsT) => any) extends ((...args: infer R) => any)
? Foo<R> : never; but an interface cannot extend that. |
Similarly, it seems that following the last example of @AlCalzone that rest element types should be able to be inferred without having to use a functions parameter list like so: type dropFirst<T extends any[]> =
T extends [any, ...(infer U)] ? U : T;
// Instead of
type dropFirst<T extends any[]> =
((...args: T) => any) extends (arg: any, ...rest: infer U) => any ? U : T; But the same error occurs: A rest element type must be an array type. |
A minimal example showing the non-symmetricity of function arguments vs. tuple types. declare function foo<T0, T extends any[]>(a: T0, ...b: T); // works
type foo<T0, T extends any[]> = [T0, ...T]; // rest element type must be an array type I think this should be supported and it seems as an oversight to me that it isn't in 3.1 already. Also, it took me quite a long time to find this issue, so I'm adding a few keywords. |
I would like to extend this issue for code looking like the following: function meh<T>(...args: Extract<T, any[]>) {} // works
type Meh<T> = [...Extract<T, any[]>] // does not work (bug?) Hopefully this all boils down to the same actual bug. |
This still seems to be an issue. I have the simple case:
Which fails currently because it can't determine that |
This is now implemented in #39094. |
TypeScript Version: 3.1.0-dev.20180801
Search Terms: spread tuple
Code
Expected behavior: Successful compilation. Array subclasses are not allowed as rest arguments for now, but when it is about generics I expect behavior similar to what is done in #24897
Actual behavior: Failed with TS2574: A rest element type must be an array type.
The text was updated successfully, but these errors were encountered: