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

如何实现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>;

类型工作原理

  1. 获取值的联合类型:T[keyof T]会提取输入对象T的所有值,生成联合类型(比如这里是"address1" | "address2" | "city" | "province" | "postalCode")。
  2. 反向查找原键:对于每个值V,通过{ [K in keyof T]: T[K] extends V ? K : never }筛选出T中值等于V的键,再用keyof提取该键。
  3. 映射原类型:将Address接口中对应原键的类型,赋值给新对象中以V为键的属性。

验证效果

最终MappedAddressOutput会生成如下类型,和你原来的定义完全一致:

type MappedAddressOutput = {
    address1: string;
    address2: string;
    city: string;
    province: string;
    postalCode: string;
}

内容的提问来源于stack exchange,提问作者Ken Yip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:15:43