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
相关产品推荐
相关产品推荐

