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

TypeScript中如何基于interface生成键名与键值一致的对象

基于 TypeScript interface 生成键值对等对象的实现方案

TypeScript 的接口(interface)属于编译期类型,运行时会被完全擦除,不存在任何运行时信息,因此原生 TS 没有能力直接从 interface 自动生成对应的运行时对象。我们通常用以下几种方案实现等价效果,保证接口和字段对象的字段完全对齐。

方案一:先定义常量对象,反向推导接口(最推荐,无额外依赖)

你可以先写需要的字段常量对象,再从对象反向推导接口,两边天然绑定不会出现不一致:

// 先定义字段常量,加as const保证值为字面量类型
const personFieldNames = {
  name: "name",
  age: "age"
} as const;

// 从常量反向推导Person接口,可自定义每个字段的类型
interface Person {
  [K in keyof typeof personFieldNames]: K extends "name" ? string : number;
}

如果不需要区分字段类型,还可以简化推导逻辑:

// 所有字段都是string类型的简化写法
type Person = Record<keyof typeof personFieldNames, string>

方案二:先定义interface,编译时校验对齐

如果你必须优先定义interface,可以写一个泛型工具函数做校验,只要对象和interface字段不一致,TS会直接报编译错误:

// 泛型校验工具函数
const defineFieldMap = <T extends object>() => {
  return <U extends { [K in keyof T]: K }>(fieldMap: U) => fieldMap;
};

// 优先定义你的interface
interface Person {
  name: string;
  age: number;
}

// 生成字段对象,TS会自动校验是否和Person字段完全对齐
const personFieldNames = defineFieldMap<Person>()({
  name: "name",
  age: "age"
});

当你给Person新增/删除字段时,personFieldNames的定义会立刻报错,强制你同步修改,避免两边不一致。

方案三:全自动化生成(需额外工具)

如果项目中这类场景较多,不想手动编写字段对象,可以使用TS编译插件或代码生成工具实现完全自动生成:

  • 使用CLI工具扫描TS文件中的interface,自动生成对应的字段常量文件
  • 配置ttypescript自定义转换器,在编译阶段直接从interface生成运行时对象
    该方案需要额外配置工具链,更适合中大型项目使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:54:04