首页 > 解决方案 > 使用字符串文字作为计算属性名称的模板参数

问题描述

假设我有几个对象,每个对象都包含一些类型相似的属性


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]是不正确的。我似乎无法弄清楚它应该是什么,或者它是否可能。

标签: typescript

解决方案


您可以使用内置映射类型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>>;


推荐阅读