我一直在使用一种打印实用程序类型TupleUnion,我在这个Twitter post中遇到了它,并在多个Stack Overflow解决方案中看到了它的使用.类型定义如下:

type TupleUnion<U extends string, R extends any[] = []> = {
    [S in U]: Exclude<U, S> extends never ? [...R, S] : TupleUnion<Exclude<U, S>, [...R, S]>;
}[U];

我在打字操场上用给定的example测试了这个类型:

interface Person {
    firstName: string;
    lastName: string;
    dob: Date;
    hasCats: false;
}
type keys = TupleUnion<keyof Person>;

这与预期的一样有效.但是,当我通过添加更多属性来稍微修改Person界面时:

interface Person {
    firstName: string;
    lastName: string;
    dob: Date;
    hasCats: false;
    a: string;
    b: string;
    c: string;
    d: string;
    e: string;
    f: string;
}

我收到以下打字错误:

Type instantiation is excessively deep and possibly infinite.(2589)

我很好奇为什么这个实用程序类型似乎对其他实用程序类型有效,但在我的情况下却导致错误,特别是在向接口添加更多属性时.TupleUnion可以处理的属性数量有限制吗,或者我还遗漏了什么?

对如何解决这一问题的任何见解或建议都将不胜感激.

推荐答案

你链接到的推特帖子上写着"谨慎使用".这就是为什么.这在现实世界中是不现实的.

keyof将创建每个属性的列表:‘FirstName’|‘a’|‘b’|.等.

看一下TupleUnion,对于这keyof个条目中的每个条目,它定义了一个子类型,它是所有其他条目的元组,并且这是递归的,具有属性数量的深度.

换句话说,对于每个属性,它递归地为对象创建一个减go 1个属性的条目,因此10到9再到8,依此类推.然后它需要的组合和条目的数量是10*9*8...等等,即(properties.length)!.(阶乘)

对于10个属性,需要定义3,628,800个字段,而TypeScrip会阻止您进行定义.

有4个属性,只有24个.差别很大.

Typescript相关问答推荐

React Hook中基于动态收件箱定义和断言回报类型

使用ngrok解析Angular 时出现HTTP故障

基于键的值的打字动态类型;种类;

为什么我的Set-Cookie在我执行下一次请求后被擦除

APIslice-CreateAPI的RTK打字错误

TypeError:正文不可用-NextJS服务器操作POST

有什么方法可以类型安全地包装import()函数吗?

使用动态输出类型和泛型可重用接口提取对象属性

FatalError:Error TS6046:';--模块分辨率';选项的参数必须是:'; node ';,'; node 16';,'; node

创建Angular 为17的动态形状时出错

在类型脚本中将泛型字符串数组转换为字符串字母并集

接受字符串或数字的排序函数

如何解决&Quot;类型不可分配给TypeScrip IF语句中的类型&Quot;?

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

在构建Angular 应用程序时,有没有办法通过CLI传递参数?

基于泛型的类型脚本修改类型

为什么看起来相似的代码在打字时会产生不同的错误?

从联合提取可调用密钥时,未知类型没有调用签名

如何将元素推入对象中的类型化数组

Angular另一个组件的nativeelement未定义