Typescript 是否有争论<;T>;像ReturnType<;T>;打字稿?

Typescript 是否有争论<;T>;像ReturnType<;T>;打字稿?,typescript,Typescript,ReturnType提取函数的返回类型 有没有一种方法可以定义参数类型以元组格式提取函数的参数类型 比如说, 参数类型布尔>将是[数字,字符串]目前无法提取任何可能函数的参数类型和数量。但您可以尝试以下方法: type ArgumentTypes<T> = T extends () => any ? never[] : T extends (a1: infer T1) => any ? [T1] :

ReturnType
提取函数的返回类型

有没有一种方法可以定义
参数类型
元组格式提取函数的参数类型

比如说,


参数类型布尔>
将是
[数字,字符串]

目前无法提取任何可能函数的参数类型和数量。但您可以尝试以下方法:

type ArgumentTypes<T> = T extends () => any ? never[] :
                        T extends (a1: infer T1) => any ? [T1] :
                        T extends (a1: infer T1, a2: infer T2) => any ? [T1, T2] :
                        // continue here for any reasonable number of args
                        never;
type ArgumentTypes=T extends()=>any?从不[]:
T扩展(a1:推断T1)=>任何?[T1]:
T扩展(a1:推断T1,a2:推断T2)=>任何?[T1,T2]:
//继续此处查看任何合理数量的参数
从未;
检查以下各项:

const args0: ArgumentTypes<() => boolean> = []; // correct
const args1: ArgumentTypes<(a: number) => boolean> = [1]; // correct
const args2: ArgumentTypes<(a: number, b: string) => boolean> = [1, 'str']; // correct

const oops0null: ArgumentTypes<() => boolean> = null; // error, arguments are array (but empty one)
const oops01: ArgumentTypes<() => boolean> = [1]; // error, arguments must be empty

const oops10: ArgumentTypes<(a: number) => boolean> = []; // error, we need one argument
const oops12: ArgumentTypes<(a: number) => boolean> = [1, 2]; // error, we need only one argument
const oops1wrong: ArgumentTypes<(a: number) => boolean> = ['str']; // error, argument must be number

const oops21: ArgumentTypes<(a: number, b: string) => boolean> = [1]; // error, we need two arguments
const oops23: ArgumentTypes<(a: number, b: string) => boolean> = [1, 'str', undefined]; // error, we need only two arguments
const oops2wrong: ArgumentTypes<(a: number, b: string) => boolean> = ['str', 1]; // error, arguments are reversed
const args0:ArgumentTypes boolean>=[];//对的
常量args1:ArgumentTypes boolean>=[1];//对的
常量args2:ArgumentTypes boolean>=[1,'str'];//对的
常量oops0null:ArgumentTypes boolean>=null;//错误,参数为数组(但为空)
常量oops01:ArgumentTypes boolean>=[1];//错误,参数必须为空
常量oops10:ArgumentTypes boolean>=[];//错误,我们需要一个参数
常量oops12:ArgumentTypes boolean>=[1,2];//错误,我们只需要一个参数
常量oops1错误:ArgumentTypes boolean>=['str'];//错误,参数必须为数字
常量oops21:ArgumentTypes boolean>=[1];//错误,我们需要两个参数
常量oops23:ArgumentTypes boolean>=[1,'str',未定义];//错误,我们只需要两个参数
常量oops2错误:ArgumentTypes boolean>=['str',1];//错误,参数被反转
请注意,这没有任何可选参数的使用-它们只是从输出中省略。我现在找不到抓住它们的方法。

Edit

自从编写原始答案以来,typescript现在有一个内置类型(在
lib.d.ts
中定义)来获取名为
parameters

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)?]

您可以阅读有关此功能的更多信息

从TypeScript 3.1开始,
参数
类型现在是标准库的一部分

type Result = Parameters<(a: number, b: string) => boolean>; // [number, string]
类型结果=参数布尔>;//[数字,字符串]

我创建了一组常见的助手类型,如下所示:

下面是typescript的许多辅助模式。 您也可以通过npm或纱线进行安装。
npm i-D tsdef

我确信
参数有很多用途,但我想找到一种方法,在私人成员上为相同的方法提供代理方法,它似乎非常适合

例如,我希望有以下内容,这样,如果
authService.login
签名发生更改,我就不必修改我的代理,只要调用它即可

login(username: string, password: string) { this.authService.login(username, password); }
使用
参数
可以执行以下操作

login = (...params: Parameters<AuthService['login']>) => this.authService.login(...params);
login=(…params:Parameters)=>this.authService.login(…params);
当然,其好处是,如果您有复杂的参数,它会很好地自行处理(可能不会建议仅对两个字符串使用此选项!)

我花了几次时间才弄明白,我需要在两次出现的
参数上都使用
..
,展开,如果您使用命名函数表达式,因此无法定义类型,则可以使用
typeof
访问参数,如下所示:

函数可更新(
diff:diff,
缓存:{[id:string]:表&IHasOBJECT\u id&IHasCONFLICTS&IHasOPTIONS},
) {
//使用typeof获取缓存的参数类型
const cacheItem:参数[1]=缓存[diff.id];
// ...
}

对于我的问题,我使用了以下样式:

constmyfunction=(items:T[],config:FuseConfigType)=>{
常数保险丝=新保险丝(项目、配置);
返回(模式:字符串):T[]=>
模式==''项:fuse.search(模式).map(({item})=>item);
};
导出默认fuseSearch;

我得到了
T
类型,项目中每个项目的类型,然后当我想要返回函数时,我使用
T
传递它,就像我得到它一样。

期待它!谢谢大家!@Joon是的,我也是,我将不得不重写很多答案,这些功能让一切变得更简单:)@TitianCernicova Dragomir只是想知道。如果我需要在类中获取函数的参数类型,该怎么办。换句话说,如何在类中使用
参数
?应该可以clearer@NahushFarkande您需要使用
参数
不要忘记对有用的答案进行投票;)@NahushFarkande为您的示例
b(参数:参数[0])
b(参数:参数[0])
(但我通常会避免多态性。这在3.0之前可能很有用。谢谢!@Joon即使在3之后它也会帮助解决TypeScript中的一个公开问题,即其他人提出了什么版本?在3.0.1中似乎没有提到任何里程碑,但它肯定存在于TypeScript 3.1中。
login(username: string, password: string) { this.authService.login(username, password); }
login = (...params: Parameters<AuthService['login']>) => this.authService.login(...params);