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

TypeScript中如何基于现有接口自动生成对应Setters接口

解决方案

分为两种适用场景实现,可根据自身需求选择:

场景1:仅需要类型定义(90%以上场景适用)

直接用TypeScript内置的映射类型+字符串工具类型实现通用泛型工具,无需手动编写每个Setters接口:

// 通用Setters工具类型
type Setters<T> = {
  [K in keyof T as K extends string ? `set${Capitalize<K>}` : never]: (value: T[K]) => void
}

// 直接传入原接口即可得到目标类型
type IStateASetters = Setters<IStateA>
type IStateBSetters = Setters<IStateB>

生成的类型完全符合要求:

  • IStateASetters 自动推导为 { setId: (value: number) => void }
  • IStateBSetters 自动推导为 { setText: (value: string) => void; setMoreText: (value: string) => void }

如果你的原接口不存在非字符串类型的属性key,还可以简化写法:

type Setters<T> = {
  [K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void
}

场景2:需要生成实际的.ts文件代码

如果需要把生成的Setters接口写入到实际的代码文件中,可以用ts-morph库遍历原接口AST批量生成,核心实现逻辑参考:

import { Project, InterfaceDeclaration } from "ts-morph";

const project = new Project();
// 加载原接口所在的文件
const sourceFile = project.addSourceFileAtPath("你的原接口文件路径.ts");
// 遍历所有接口
sourceFile.getInterfaces().forEach((interfaceDec: InterfaceDeclaration) => {
  const setterInterfaceName = `${interfaceDec.getName()}Setters`;
  const setterInterface = sourceFile.addInterface({
    name: setterInterfaceName,
    isExported: true,
  });
  // 遍历原接口所有属性生成set方法
  interfaceDec.getProperties().forEach(prop => {
    const propName = prop.getName();
    const setterName = `set${propName.charAt(0).toUpperCase() + propName.slice(1)}`;
    const propType = prop.getType().getText();
    setterInterface.addMethod({
      name: setterName,
      parameters: [{ name: "value", type: propType }],
      returnType: "void",
    });
  });
});
// 保存生成后的文件
sourceFile.save();

运行脚本后就会在原文件中自动生成所有符合要求的Setters接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:02