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