打字稿 3.1
自从写了原始答案以来,打字稿现在有一个内置类型(定义在lib.d.ts
) 获取调用的参数的类型Parameters https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype.
type argsEmpty = Parameters<() => void>
// []
type args = Parameters<(x: number, y: string, z: boolean) => void>
// [number, string, boolean]
type argsOpt = Parameters<(x: number, y?: string, z?: boolean) => void>
// [number, (string | undefined)?, (boolean | undefined)?]
原答案
EditTypescript 3.0 已发布,以下代码按预期工作。
虽然在当前版本的 typescript (2.9) 中如果不拼写出所有参数,这是不可能的。这将在未来几天发布的下一个版本的 typescript (3.0) 中成为可能:
type ArgumentsType<T> = T extends (...args: infer U) => any ? U: never;
type argsEmpty = ArgumentsType<() => void>
// []
type args = ArgumentsType<(x: number, y: string, z: boolean) => void>
// [number, string, boolean]
type argsOpt = ArgumentsType<(x: number, y?: string, z?: boolean) => void>
// [number, (string | undefined)?, (boolean | undefined)?]
如果你安装npm install typescript@next
你已经可以玩这个了,它应该在本月的某个时候上市。
Note
我们还可以使用这个新功能将元组分散到参数中:
type Spread<T extends any[]> = (...args: T) => void;
type Func = Spread<args>
// (x: number, y: string, z: boolean) => void
您可以阅读有关此功能的更多信息here https://github.com/Microsoft/TypeScript/pull/24897