TypeScript如何给接口添加keyof结合模板字面量生成的动态键
TS 中 interface 内部不支持直接使用映射类型语法([K in U]),也不支持将联合字面量作为索引签名参数类型,这就是你之前两种写法报错的原因。
解决方案
可以先通过 type 定义通用的前缀字段生成工具,再让你的 Metadata 接口继承生成的映射类型即可,不需要修改原有继承逻辑。
第一步:定义通用前缀映射工具
// 通用工具:为类型 T 的所有字段添加指定前缀 Prefix,生成新的对象类型 type PrefixedFields<T, Prefix extends string> = { [K in keyof T as `${Prefix}${string & K}`]: T[K] }
第二步:拼接进原有 Metadata 接口
假设你原有 Metadata 已经继承了其他接口,直接在 extends 列表中追加生成的前缀类型即可:
// 你的业务接口定义 interface Schedule { interval: "month" | "day"; price: number; } // 你原有继承了其他接口的基础 Metadata interface BaseMetadata { foo: string; bar: string; } // 直接继承生成的前缀类型即可,支持同时拼接多个不同接口的前缀字段 interface Metadata extends BaseMetadata, PrefixedFields<Schedule, 'schedule__'> // 有其他接口需要拼接就继续往后加,比如 PrefixedFields<User, 'user__'> {}
效果验证
// 类型校验完全符合预期 const meta: Metadata = { foo: "a", bar: "b", schedule__interval: "month", schedule__price: 99 }
如果你的场景允许用type别名做最终导出,也可以用交叉类型实现,效果完全一致:
type FinalMetadata = BaseMetadata & PrefixedFields<Schedule, 'schedule__'>
内容的提问来源于stack exchange,提问作者Jozef - Spatialized.io
相关产品推荐
相关产品推荐

