使用字符串文字作为计算属性名称的模板参数

时间:2019-08-28 08:33:56

标签: typescript

让我们说我有一些对象,每个对象都包含一些类型相似的属性


interface Stuff<T> {
  a: number;
  b: string;
  c: T;
}

type ThingOne {
  one: Stuff<string>;
}

type ThingTwo {
  two: Stuff<number>;
}

type ThingThree {
  three: Stuff<boolean>;
}

我可以使用泛型参数化属性名称吗? 我在想一些类似的事情:


interface Thing<T, U> {
  [key: U]: Stuff<T>;
}

// then

type ThingOne = Thing<string, 'one'>;
type ThingTwo = Thing<number, 'two'>;
type ThingThree = Thing<boolean, 'three'>;

显然[key: U]是错误的。我似乎无法弄清楚应该是什么,甚至可能。

1 个答案:

答案 0 :(得分:1)

您可以使用内置映射类型Record,该映射类型采用string文字类型(或字符串文字类型的并集)作为属性名称,以及成员的类型:

interface Stuff<T> {
  a: number;
  b: string;
  c: T;
}

type ThingOne = Record<'one', Stuff<string>>;
type ThingTwo = Record<'two', Stuff<number>>;
type ThingThree = Record<'three', Stuff<boolean>>;

Play