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
相关产品推荐
相关产品推荐

