打字稿中括号符号的类型

时间:2020-04-08 11:35:43

标签: typescript

我正在尝试为某些常规状态更新创建一个redux动作,并想知道是否可以使类型适用于括号表示法:

interface IThing {
  someProp: string;
  otherProp: boolean;
}

const state = {
  thing: {
    someProp: 'prop',
    otherProp: true,
  } as IThing
}

const action = { name: 'someProp' as keyof IThing, value: 'someValue' as any }

// gives typescript error: Type 'any' is not assignable to type 'never'
state.thing[action.name] = action.value;

1 个答案:

答案 0 :(得分:1)

这里的问题是,如果要通过动态属性名称分配值,则需要将右侧的值分配给您可能命名的任何属性。在这种情况下,这意味着它必须同时可分配给stringboolean,这意味着它必须为never类型(因为这两种类型没有通用值)。

解决方案是使用泛型类型,以便您可以将属性名称约束为K类型,并且分配的值可以为IThing[K]类型,而不一定是{{ 1}}。这是一个示例:

never

Playground Link