网站搜索

TypeScript:如何使用索引签名初始化具有动态键的对象?


是否有可能简化以下内容,以便当我有一种新产品类型时,我不需要为新产品类型添加另一行代码来初始化它?如果我不初始化变量,就会有语法错误。

enum ProductType {
   PC = 'pc',
   LAPTOP = 'laptop',
   TV = 'tv'
}

let productList: { [key in ProductType]: Product[] | undefined } = {
  [ProductType.PC]: undefined,
  [ProductType.LAPTOP]: undefined,
  [ProductType.TV]: undefined
}

答案#1

如果我理解正确,你想要避免在初始化对象中为每个新的 ProductType 添加新行,这里有一个可能的解决方案。通过将枚举的键归约为一个对象,使其更加动态。

enum ProductType {
  PC = 'pc',
  Laptop = 'laptop',
}

const o = Object.values(ProductType).reduce(
   (acc, key) => ({
      ...acc,
      [key]: undefined,
   }),
   {} as Record<ProductType, undefined>
);

// const o = { pc: undefined, laptop: undefined };

答案#2

我按照VLAZ的建议编写了代码

let productList: { [key in ProductType]?: UserProduct[] | undefined } = {}