使用TypeWriter时如何为特定类型条件性生成方法?
我之前在使用TypeWriter生成TypeScript类时,也踩过条件方法添加的语法坑,给你梳理下正确的写法和问题排查方向:
核心问题:用错了TypeWriter的模板语法
TypeWriter的模板是基于Razor风格的@指令,不是你尝试的$if语法,这是导致两种错误的根本原因:
- 第一种报错(意外/无效令牌):因为TypeWriter不识别
$if,把$当成了非法字符; - 第二种输出整个代码块:同样是因为
$if不被解析,直接被当作普通文本输出了。
正确的条件方法添加示例
下面给你两个常见场景的正确模板写法,你可以根据自己的需求调整:
场景1:针对包含特定C#类型属性的模型添加方法
比如给所有包含DateTime类型属性的C#模型,自动生成一个日期格式化方法:
export class @(model.Name) { // 生成常规属性 @foreach (var prop in model.Properties) { public @(prop.Name): @(prop.Type.TypeScriptName); } // 条件添加方法:当模型有DateTime类型属性时 @if (model.Properties.Any(p => p.Type.Name == "DateTime")) { // 这里可以根据实际需求写TS方法逻辑 public formatFirstDate(): string { // 取第一个DateTime类型的属性做格式化 const dateProp = "@(model.Properties.First(p => p.Type.Name == "DateTime").Name)"; return new Date(this[dateProp]).toLocaleDateString("zh-CN"); } } }
场景2:针对特定名称的C#模型添加方法
比如只给名为User的C#模型添加一个获取全名的方法:
export class @(model.Name) { @foreach (var prop in model.Properties) { public @(prop.Name): @(prop.Type.TypeScriptName); } // 条件:仅当模型名称是User时添加 @if (model.Name == "User") { public getFullName(): string { return `${this.firstName} ${this.lastName}`; } } }
额外注意事项
- 模板内的C#语法要正确:
@if后面的表达式是C#代码,比如model.Properties.Any(...)是LINQ方法,TypeWriter默认支持System.Linq,不用额外引用; - 区分C#类型和TS类型:
p.Type.Name是C#原类型名(比如DateTime),p.Type.TypeScriptName是生成后的TS类型名(比如Date),别搞混; - 语法闭合要严谨:TypeWriter对模板的语法检查很严格,大括号、引号一定要配对,否则容易触发语法错误。
内容的提问来源于stack exchange,提问作者user47589
相关产品推荐
相关产品推荐

