You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何初始化映射类型的属性?

解决方案

核心问题是TypeScript的类型仅存在于编译阶段,运行时无法直接遍历Fruit联合类型。我们需要将类型与运行时数据绑定,通过维护一份运行时的水果列表自动生成初始化对象,避免手动重复编写属性。

步骤1:绑定类型与运行时数据

先定义运行时的水果数组,同时从数组推导Fruit类型,确保二者完全同步:

// 运行时水果列表,as const 固定元素为字面量类型
const FRUITS = ["apple", "banana", "cherry"] as const;
// 从数组自动推导Fruit联合类型,后续加水果只需修改FRUITS数组
type Fruit = typeof FRUITS[number];

步骤2:封装初始化工具函数

写一个通用函数,根据给定的键数组和默认值生成对应结构的对象:

function createInitialObject<T extends string>(keys: readonly T[], defaultValue: number): Record<T, number> {
  return keys.reduce((obj, key) => {
    obj[key] = defaultValue;
    return obj;
  }, {} as Record<T, number>);
}

步骤3:修改类的实现

利用工具函数在构造函数中完成自动初始化:

interface FruitShop2 {
  priceList: Record<Fruit, number>;
  stock: Record<Fruit, number>;
}

class FruitShopImpl implements FruitShop2 {
  priceList: Record<Fruit, number>;
  stock: Record<Fruit, number>;

  constructor() {
    // 自动生成priceList(所有水果价格初始为1)和stock(所有库存初始为0)
    this.priceList = createInitialObject(FRUITS, 1);
    this.stock = createInitialObject(FRUITS, 0);
  }
}

优势说明

  • 维护成本低:后续添加新水果,只需要在FRUITS数组中加入元素,Fruit类型、priceList和stock的结构会自动更新,初始化逻辑无需改动。
  • 类型安全:工具函数的泛型保证了返回对象的类型完全符合FruitShop2的要求,编译阶段就能检查类型错误。

内容的提问来源于stack exchange,提问作者Dan Stevens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:06:26