網站搜尋

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 } = {}