如何实现TypeScript中以对象值为键的ObjectValueAsKey类型?
实现
ObjectValueAsKey泛型类型 你可以通过映射类型结合条件类型反向查找来实现ObjectValueAsKey,它会将输入对象的所有值作为新对象的键,并映射原Address接口中对应原键的类型。
完整实现代码
interface Address { addressLine1: string; addressLine2: string; city: string; province: string; postalCode: string; } const AddressMap = { addressLine1: "address1", addressLine2: "address2", city: "city", province: "province", postalCode: "postalCode" }; // 实现ObjectValueAsKey泛型 type ObjectValueAsKey<T> = { [V in T[keyof T]]: Address[keyof { [K in keyof T]: T[K] extends V ? K : never }] }; // 现在可以直接使用 type MappedAddressOutput = ObjectValueAsKey<typeof AddressMap>;
类型工作原理
- 获取值的联合类型:
T[keyof T]会提取输入对象T的所有值,生成联合类型(比如这里是"address1" | "address2" | "city" | "province" | "postalCode")。 - 反向查找原键:对于每个值
V,通过{ [K in keyof T]: T[K] extends V ? K : never }筛选出T中值等于V的键,再用keyof提取该键。 - 映射原类型:将
Address接口中对应原键的类型,赋值给新对象中以V为键的属性。
验证效果
最终MappedAddressOutput会生成如下类型,和你原来的定义完全一致:
type MappedAddressOutput = { address1: string; address2: string; city: string; province: string; postalCode: string; }
内容的提问来源于stack exchange,提问作者Ken Yip
相关产品推荐
相关产品推荐

