如何使用数组作为 const 来指定索引签名 TypeScript 中可能的索引?

Mar*_*har 3 types typescript

我想创建一个数组,它将指定哪些字符串将索引对象内的属性以及该对象属性仅包含函数。

我所理解的是,我可以从数组创建联合类型:

我的工作案例是React减速器中的减速器操作(指令)(但它可以在其他地方使用):

const InstructionsArray = [
    'HANDLE_BUTTON_CONVERT_INPUT',
    'HANDLE_CHECKBOX_CONVERT_ON_INPUT',
    'HANDLE_CHECKBOX_DISPLAY_TAGS',
    'HANDLE_TEXTAREA_INPUT',
    'HANDLE_RUNTIME'
] as const;
Run Code Online (Sandbox Code Playgroud)

然后我有带有属性的类型对象:

instruction: typeof InstructionsArray[number]
Run Code Online (Sandbox Code Playgroud)

当然,普通数组允许我们使用任何字符串作为索引,但由于我们将其转换为const,所以它现在只允许使用我们在 array 中指定的字符串。

我真正想要的是拥有一个对象,该对象将具有一些属性名称,并且string所有属性的值均为function。我只想指定那些属性名称 ( string),但由于每个值都是 a function,我不想多次指定它,因此可以认为这是理所当然的。

当前代码如下所示:

const changersLabels = [
    'inventory',
    'quest'
] as const;
Run Code Online (Sandbox Code Playgroud)

但“相同”的方式不适用于这样的对象:

keyboardRouter(changers: {[key:typeof changersLabels[number]:Function]}) {

    //some stuff

}
Run Code Online (Sandbox Code Playgroud)

我做错了什么,这可能吗?

jca*_*alz 5

看起来您只想要一个映射类型,其中键typeof changersLabels[number]和属性都是Function

function keyboardRouter(changers: { [K in typeof changersLabels[number]]: Function }) {
  changers.inventory // Function
  changers.quest // Function
}
Run Code Online (Sandbox Code Playgroud)

映射类型看起来有点像带有索引签名的类型,但这只适用于索引为 typestring或 of type 的情况number。对于其他类型(例如字符串文字的联合),您需要带有运算符的映射类型in

可以稍微重构一下,为您的键命名并使用内置Record实用程序类型

type ChangersLabels = typeof changersLabels[number];
function keyboardRouter2(changers: Record<ChangersLabels, Function>) {
  changers.inventory // Function
  changers.quest // Function
}
Run Code Online (Sandbox Code Playgroud)

Playground 代码链接