gpt4 book ai didi

typescript - 元组泛型

转载 作者:搜寻专家 更新时间:2023-10-30 21:12:18 25 4
gpt4 key购买 nike

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

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

第一个重载看起来像:

var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]);

函数在特定时间段后以 param1、param2、... 调用。

如何表示函数接受与 param1, param2, ... 相同类型的参数?

我试过:

public setTimeout<T>( 
callback:(...args: T) => void) | string,
delay, ...args: T) {}

但它不起作用,因为 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[] 的重载应该是列表中的最后一个。

注意:如果回调参数和函数参数不匹配,代码仍然会编译,因为它回退到 any[] 版本:

// Still compiles
setTimeout((s : string, d: string)=> {
// Code
}, "", 3);

关于typescript - 元组泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45913680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com