我一直在使用一种打印实用程序类型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可以处理的属性数量有限制吗,或者我还遗漏了什么?
对如何解决这一问题的任何见解或建议都将不胜感激.