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

如何从对象自动生成含指定方法的键的TypeScript类型?

解决方案

要自动从items对象生成对应类型、避免硬编码,你可以借助TypeScript的条件类型和映射类型实现,具体步骤如下:

1. 保留对象的精确类型

先给items加上as const断言,确保TypeScript不会把对象类型推断成宽泛结构,而是保留每个键的具体属性信息:

const items = {
    a: { create: () => "hello" },
    b: { create: () => "hello", delete: () => "goodbye" },
    c: { delete: () => "goodbye" },
} as const;

2. 定义通用类型提取工具

创建一个泛型类型,专门提取对象中拥有指定属性的键:

type ExtractKeysWithProperty<T, Prop extends string> = {
  [K in keyof T]: Prop extends keyof T[K] ? K : never;
}[keyof T];

这个类型的逻辑很直接:遍历对象的每个键K,检查指定属性Prop是否存在于该键对应的子对象中,存在就返回K,否则返回never;最后通过[keyof T]合并所有结果,never会被自动排除,剩下的就是符合条件的键的联合类型。

3. 生成目标类型

直接用上面的工具类型,传入typeof items和要检查的方法名,就能得到想要的类型:

type CreateItems = ExtractKeysWithProperty<typeof items, 'create'>; // 结果:'a' | 'b'
type DeleteItems = ExtractKeysWithProperty<typeof items, 'delete'>; // 结果:'b' | 'c'

简化写法(无需通用工具)

如果不需要复用类型提取逻辑,也可以直接写针对items的专属类型:

type CreateItems = keyof {
  [K in keyof typeof items]: typeof items[K] extends { create: any } ? K : never;
};

type DeleteItems = keyof {
  [K in keyof typeof items]: typeof items[K] extends { delete: any } ? K : never;
};

后续只要items的结构修改,对应的类型会自动更新,完全不用手动硬编码键名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:29:58