作者:手机用户2602889563 | 来源:互联网 | 2023-02-01 20:46
我想为第一个元素是特定类型(例如Function)的数组定义一个类型,其余元素是空类型.例如:
type FAs = [Function, {}, {}, {}, ...]; // pseudo code
这样的事情可能吗?
目的是提供像这样的单参数函数:
const myCaller = ([fun, ...args]: FAs) => fun.apply(args);
另一种方法是使用两个参数myCaller
,如下所示:
const myCaller = (fun: Function, args: any[]) => fun.apply(args);
但出于审美原因,我宁愿使用一个论点.我也想知道类型系统是否支持可以说是任意长度的元组.也许这样的事情对于我不理解的计算机科学原因是不可取的.
1> 小智..:
在当前版本的Typescript中,可以使用数组扩展来实现:
type FAs = [Function, ...Array<{}>]
它支持1到n之间的任何长度(需要第一个元素)。
2> 小智..:
如果你定义
type FAs = [Function, {}];
那么类型的值FAs
将需要第一个类型元素Function
,第二个元素元素{}
和后续元素Function | {}
.这就是TypeScript文字数组类型的工作方式.来自TS文档:
访问已知索引集之外的元素时,将使用联合类型:
这应该做你想要的一切,除了你能够传入一个Function
-typed值作为数组的第三个元素等.但事实上,无论如何Function
都是如此,因为兼容{}
.
没有办法解决这个问题.TS中没有办法定义一个数组类型,其中前n个元素具有某些特定类型,并且存在任意数量的其他特定类型的剩余元素.
我也想知道类型系统是否支持可以说是任意长度的元组.
实际上,类型系统只支持任意长度的元组.如果你说
type Tuple = [number, number];
此类型与任何长度为2 或更大的数组兼容,其中包含数字.如果你说
type Tuple = [string, number];
这种类型与长度为2 或更长的任何数组兼容,它有一个字符串作为它的第一个元素,一个数字作为它的第二个,并且字符串或数字作为它的第三个等等.我不会称这种行为的原因"以计算机科学为基础; 更重要的是TS检查的可行性.
另一种方法
interface Arglist {
[index: number]: object;
0: Function;
}
const a1: Arglist = [func];
const a2: Arglist = [22]; // fails
const a3: Arglist = [func, "foo"]; // fails
const a4: Arglist = [func, obj];
const a5: Arglist = [func, obj, obj];