同一接口中不能有常规属性和计算属性键

时间:2019-10-11 21:35:42

标签: typescript

TypeScript版本:3.6.4

在我的状态下,我想在接口内同时拥有一个计算属性和一个常规属性键,但是TypeScript在解析该属性时遇到了麻烦。在存储库上创建GitHub问题之前,我只想确保自己没有做错任何事情并且浪费了开发人员的时间。

type Stat = 'hp' | 'attack' | 'defense' | 'speed';

interface State {
    [x in Stat]: number;
    type: string
}

我以为这样可以,但是TypeScript高亮显示type并说'}' expected. ts(1005)。如果我将type放在顶部,则会突出显示[x in Stat]并说A computed property name must be of type 'string', 'number', 'symbol', or 'any'. ts(2464)'Stat' only refers to a type, but is being used as a value here.ts(2693)。如果我注释掉两行之一,TypeScript完全可以。

我在这里做错什么了吗?还是不可能?

2 个答案:

答案 0 :(得分:1)

如果对您的工作没有更好的了解,我的建议可能无法实现。

您可能可以从映射类型和交集中得出一些结论:

/** Refefernce interface */
interface IStat {
  attack: unknown;
  defense: unknown;
  hp: unknown;
  speed: unknown;
}

/** (optional) `keyof` reference interface */
type Stat = keyof IStat

/** Mapped IStat properties intersected with `type` */
type State = {
  [K in keyof IStat]?: number; // change `number` with IStat[K] if you want the types from IStat;
} & { type: string; };

这里是Typescript Playground,供您进一步尝试这种方法。

答案 1 :(得分:1)

这是你想要的吗?

type Stat = 'hp' | 'attack' | 'defense' | 'speed';

type State = Record <Stat, number> & {
  type: string;
}

const s: State = {
  hp: 100,
  attack: 12,
  defense: 12,
  speed: 3,
  type: "myType"
}