如何创建以联合类型为键且无需全量赋值的TypeScript Record
解决TypeScript联合类型作为键的部分映射问题
先看定义的联合类型:
type SubscriptionLevel = 'normal' | 'premium' | 'cancelled';
想要创建一个以该联合类型为键的对象,但只需要给部分键赋值,直接用Record<SubscriptionLevel, string | undefined>会触发TS报错——因为Record要求所有键必须存在,哪怕值是undefined,手动补全每个缺失的键太繁琐。
下面是几种简洁且类型安全的实现方式:
方法一:用Partial工具类型包装Record
直接借助TS内置的Partial工具,把Record的所有属性转为可选:
const badgeIcon: Partial<Record<SubscriptionLevel, string>> = { 'premium': 'crown', 'cancelled': 'grayed', };
这样既不用补全所有键,又能保证键只能是SubscriptionLevel里的成员,避免拼写错误,完全符合类型安全要求。
方法二:自定义PartialRecord类型
如果觉得Partial<Record<...>>不够直观,可以自定义一个更明确的类型:
// 自定义部分键映射类型 type PartialRecord<K extends keyof any, T> = { [P in K]?: T; }; const badgeIcon: PartialRecord<SubscriptionLevel, string> = { 'premium': 'crown', 'cancelled': 'grayed', };
这个自定义类型和第一种实现逻辑完全一致,只是命名更清晰,一眼就能看出是支持部分键赋值的映射。
补充说明
这两种方法都能保证:
- 只能使用
SubscriptionLevel中的值作为键,杜绝拼写错误 - 无需手动给未用到的键赋值
undefined - 类型检查依然生效,比如给键赋值非string类型会触发TS报错
内容的提问来源于stack exchange,提问作者Steve B
相关产品推荐
相关产品推荐

