Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 元组的泛型_Typescript - Fatal编程技术网

Typescript 元组的泛型

Typescript 元组的泛型,typescript,Typescript,是否可以将泛型变量定义为元组 例如: 让我们使用计时器api和 第一个重载看起来像: var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]); 使用param1、param2、,。。。经过一段时间 如何表示函数接受与param1、param2等相同类型的参数 我试过: public setTimeout<T>( callback:(...args: T) => void) | stri

是否可以将泛型变量定义为元组

例如: 让我们使用计时器api和

第一个重载看起来像:

var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]);
使用param1、param2、,。。。经过一段时间

如何表示函数接受与param1、param2等相同类型的参数

我试过:

public setTimeout<T>( 
callback:(...args: T) => void) | string, 
delay, ...args: T) {}
公共设置超时(
回调:(…args:T)=>void)|字符串,
延迟,…args:T{}
但它不起作用,因为它不能像[string,int]那样保存元组


有没有一种方法可以用typescript来表达这一点?

不幸的是,我看到的唯一方法是声明函数的多个重载,并增加参数数量,如果参数数量大于定义的最大值,则返回到
any[]
。对于大多数实际情况,这应该给调用者一个良好的类型化体验(回调的参数将被推断出它们的参数类型),即使定义需要编写更多的工作。对于setTimeout,3应该是足够数量的参数,但如果需要,可以添加更多参数:

export declare function setTimeout<T1>( callback:(args1: T1) => void | string, args: T1);
export declare function setTimeout<T1, T2>( callback:(arg1: T1, arg2: T2) => void | string, arg1: T1, arg2: T2);
export declare function setTimeout<T1, T2, T3>( callback:(arg1: T1, arg2: T2, arg3: T3) => void | string, arg1: T1, arg2: T2, arg3: T3);
export declare function setTimeout(callback:(...args: any[]) => void | string, ...args: any[]);


setTimeout((s,d)=> { 
    console.log(s);  // s is string
    d= d+1; // d is a number
}, "", 3);

这不会提供任何类型安全性-如果您使用错误的参数调用它,它将返回到“any”重载,而不是编译错误。您是对的,它只会根据传递给函数的参数为回调函数的参数提供类型推断。编辑原始答案以反映@TomasNikodym的反馈
// Still compiles
setTimeout((s : string, d: string)=> { 
    // Code
}, "", 3);