如何在TypeScript中定义键为枚举部分成员的Record类型
如何在TypeScript中定义键为枚举部分成员的Record类型
嘿,我懂你现在的困扰——手里有个枚举,想做一个对象,它的键只需要用这个枚举里的部分成员,同时还要让TypeScript给这个对象加上正确的类型约束,对吧?我来给你拆解几种好用的方法:
首先先把你的枚举代码摆出来,方便对照:
enum Foo { A = "A", B = "B", C = "C" }
你的目标对象大概是这样的,只用到了枚举里的A和B:
const Bar = { A: {/* 你的自定义内容 */}, B: {/* 你的自定义内容 */} }
方法1:明确指定允许的枚举成员(精准控制)
如果你已经确定了要用到枚举里的哪几个成员,直接把这些成员组成联合类型放到Record的第一个泛型参数里就行。不过要注意,Record<K, V>默认要求K里的所有键都必须出现在对象里,如果想让这些键是可选的,就搭配Partial工具类型。
比如先定义你对象值的类型,假设是{ id: number }:
type BarItem = { id: number }; // 要求必须包含A和B两个键 const Bar1: Record<Foo.A | Foo.B, BarItem> = { A: { id: 1 }, B: { id: 2 } // 这里如果少写A或B,TypeScript会直接报错 }; // 允许包含A、B的任意子集(可以只写A,或者只写B,或者都写) const Bar2: Partial<Record<Foo.A | Foo.B, BarItem>> = { A: { id: 1 } // 这里不写B也不会报错,完美符合“不一定包含所有”的需求 };
方法2:允许枚举的任意部分成员(灵活宽松)
如果你不想限制具体用哪几个枚举成员,只要对象的键是枚举里的成员就行,不管选多少个,那直接用Partial<Record<Foo, BarItem>>就可以了:
type BarItem = { id: number }; const Bar: Partial<Record<Foo, BarItem>> = { A: { id: 1 }, C: { id: 3 } // 这里可以随便选Foo里的成员,想加A加A,想加C加C,完全自由 // 但如果写个Foo里没有的键,比如D,TypeScript会立刻报错,帮你规避错误 };
方法3:用Pick工具类型(基于枚举的键名)
如果习惯用TypeScript的工具类型,也可以用Pick来选取枚举的部分键名,再组合成Record类型。比如只选取"A"和"B"这两个键名:
type BarItem = { id: number }; // Pick<typeof Foo, "A" | "B">会提取出Foo枚举中键名为A和B的部分 const Bar: Record<keyof Pick<typeof Foo, "A" | "B">, BarItem> = { A: { id: 1 }, B: { id: 2 } }; // 同样,如果要让键可选,就套上Partial: const BarOptional: Partial<Record<keyof Pick<typeof Foo, "A" | "B">, BarItem>> = { B: { id: 2 } };
这几种方法都能完美解决你的问题,你可以根据自己的实际需求选最顺手的那个~
内容来源于stack exchange
相关产品推荐
相关产品推荐

