如何从联合类中提取body属性类型并构建对应类型对象
构建类名加Body后缀的类型映射对象
直接通过映射类型+键重映射结合内置工具类型就能实现需求,完整代码如下:
class Foo { body: {foo: string} constructor(body: Record<string, string>) { this.body = { foo: body.foo } } } class Bar { body: {bar: string} constructor(body: Record<string, string>) { this.body = { bar: body.bar } } } const pages = { 'foo': Foo, 'bar': Bar } as const // 核心类型定义 type PageBodyMap = { [K in keyof typeof pages as `${K}Body`]: InstanceType<typeof pages[K]>['body'] }
关键部分解释
- 键重映射:使用
as${K}Body``将原pages的键名(foo/bar)拼接成带Body后缀的新键(fooBody/barBody),这是TypeScript 4.1及以上支持的语法。 - 获取实例类型:通过内置工具类型
InstanceType<typeof pages[K]>,从类的构造函数类型中提取对应的实例类型。 - 提取body属性类型:在实例类型后通过
['body']直接获取类实例上body属性的类型。
最终PageBodyMap的类型结构完全符合需求:
type PageBodyMap = { fooBody: { foo: string }; barBody: { bar: string }; }
内容的提问来源于stack exchange,提问作者Pezholio
相关产品推荐
相关产品推荐

