如何获得数组的所有可能索引作为数字联合类型?

Expected result a number union type:

type VoiceSettings = {
    similarityLevel: 0 | 1 | 2 | 3 | 4 | 5;
    stabilityLevel: 0 | 1 | 2 | 3 | 4;
}

Actual result:

type VoiceSettings = {
    similarityLevel: "0" | "1" | "2" | "3" | "4";
    stabilityLevel: "0" | "1" | "2" | "3" | "4";
}

Code:

const VALUES_MAP = {
  similarityLevel: [0, 15, 30, 50, 75, 90],
  stabilityLevel: [15, 30, 60, 75, 90],
} as const;

type ValuesTypes = keyof typeof VALUES_MAP;

type VoiceSettings = {
  [key in ValuesTypes]: Exclude<keyof (typeof VALUES_MAP)[ValuesTypes], keyof []>;
};

这是TS playground

推荐答案

在TypScript 4.8及更高版本中,您可以通过在a template literal type中使用an extends constraint on an infer type variable将任意数字字符串literal types转换为对应的数字文字类型.

type StrToNum<T extends string> =
  T extends `${infer N extends number}` ? N : never

type X = StrToNum<"1" | "-7" | "3.14159">;
// type X = 1 | -7 | 3.14159

一旦您这样做,就很容易将其应用于tuple type的数字字符串索引️🤷‍

type VoiceSettings = {
  -readonly [K in keyof ValuesMap]: (
    StrToNum<`${number}` & keyof ValuesMap[K]>
  )
};
/* type VoiceSettings = {
    similarityLevel: 0 | 5 | 1 | 2 | 3 | 4;
    stabilityLevel: 0 | 1 | 2 | 3 | 4;
} */

通过将keyof ValuesMap[K]`${number}`(占位符模板文本)相交,我们只得到那些类似数字的字符串. 不过,你可以按照你的方式来做,并排除keyof [].

Playground link to code

Typescript相关问答推荐

Angular 17 -如何使用新的@if语法在对象中使用Deliverc值

node—redis:如何在redis timeSeries上查询argmin?

在将对象从一个对象转换成另一个对象时,可以缩小对象的键吗?

单击并移除for循环中的一项也会影响另一项

如何缩小变量访问的对象属性范围?

在键和值为ARGS的泛型函数中未正确推断类型

类型,其中一条记录为字符串,其他记录为指定的

如何在Reaction路由v6.4加载器和操作中获得Auth0访问令牌?

为什么&;(交集)运算符会删除不相交的属性?

如何通过TypeScrip中的函数防止映射类型中未能通过复杂推理的any值

17个Angular 的延迟观察.如何在模板中转义@符号?

打字脚本中的模块化或命名空间

创建一个TypeScrip对象并基于来自输入对象的约束定义其类型

创建一个函数,该函数返回一个行为方式与传入函数相同的函数

如何调整项目数组,但允许权重影响顺序

从泛型对象数组构造映射类型

在ts中获取级联子K类型?

覆盖高阶组件中的 prop 时的泛型推理

元素隐式具有any类型,因为string类型的表达式不能用于索引类型{Categories: Element;管理员:元素; }'

如何使用布尔值构建对象 TYPE,但至少有一个必须为 true