如何从对象自动生成含指定方法的键的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
相关产品推荐
相关产品推荐

