Typescript 有没有办法把元组的键作为数字?
假设我有一些元组类型:Typescript 有没有办法把元组的键作为数字?,typescript,generics,tuples,Typescript,Generics,Tuples,假设我有一些元组类型: type SomeTuple = ["a", "b", "c"]; 现在我想以某种方式得到它的键作为数字: type SomeTupleKeys<T = SomeTuple> = 0 | 1 | 2; 但这一条给了我线索: “0”|“1”|“2” 有没有一种不用硬编码就能得到数字的方法 这可以通过(在Typescript 4.1中添加)实现: 键入TupleKeys= T扩展[expert u,…expert R] ? 元组键 :按键[数字]; 键入Som
type SomeTuple = ["a", "b", "c"];
现在我想以某种方式得到它的键作为数字:
type SomeTupleKeys<T = SomeTuple> = 0 | 1 | 2;
但这一条给了我线索:
“0”|“1”|“2”
有没有一种不用硬编码就能得到数字的方法
这可以通过(在Typescript 4.1中添加)实现:
键入TupleKeys=
T扩展[expert u,…expert R]
? 元组键
:按键[数字];
键入SomeTuple=[“a”、“b”、“c”];
键入SomeTupleKeys=TupleKeys;//0 | 2 | 1
另一个更简单的解决方案(使用较旧的typescript版本):
键入tuplekeys为什么需要这个SomeTuple[1]
和SomeTuple[“1”]
选择相同的元素;是否存在需要数字而不是字符串的用例?@jcalz,{[key in TupleKeys]:{length:key}}
-我在length
属性中的字符串有问题…“没有硬编码”?可能没有得到任何支持。您可以创建一个递归类型,使元组增长到其长度匹配为止,但这比像[0,1,2,3,4,5,6,7,8,9,10,11,12,
..]
这样的大元组更密集。@jcalz,我实际上不知道如何创建一个递归类型…请参阅相关答案,其中字符串键“0”,“1”
。。。将映射元组的属性转换为数字类型,使其与元组length
number属性相比较。但是我仍然会称之为hacky,所以在这里没有硬编码也不是一个简单的解决方案。很酷,除了它们都与可选元素一起工作。顺便说一句,我会在单独的答案中发布它。还有一个选项(保留可选索引):typetuplekeys=Exclude代码>
type B = (SomeTuple extends infer T ? { [K in keyof T]: K extends keyof T ? K : never } : never)[number];
type TupleKeys<T extends ReadonlyArray<unknown>, Keys extends ReadonlyArray<number> = []> =
T extends [infer _, ... infer R]
? TupleKeys<R, [R['length'], ...Keys]>
: Keys[number];
type SomeTuple = ["a", "b", "c"];
type SomeTupleKeys = TupleKeys<SomeTuple>; // 0 | 2 | 1
type TupleKeys<T extends Array<any>> = Exclude<Partial<T>['length'], T['length']>;
type SomeTuple = ["a", "b", "c"];
type SomeTupleKeys = TupleKeys<SomeTuple>; // 0 | 1 | 2