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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:21:02