能否通过x typescript命令导出服务常量及DTO默认值至TypeScript?
解决C# DTO默认值导出到TypeScript的方法
你的问题核心是代码生成工具默认只导出类型定义,未同步C#属性的默认值到TS文件中,以下是几种实用的解决办法:
1. 用NSwag工具配置(最常用场景)
如果团队使用NSwag生成TS代码,可通过两步实现默认值同步:
- 给C# DTO的属性添加
[DefaultValue]特性,明确标记默认值:using System.ComponentModel; public class SearchDto { [DefaultValue("default query")] public string DefaultQuery { get; set; } = "default query"; } - 修改NSwag的配置文件(比如
nswag.json),开启导出默认值的选项:{ "codeGenerators": { "typescript": { "generateDefaultValues": true, // 其他原有配置项... } } }
重新生成后,TS文件会自动生成包含默认值的常量对象:
export interface SearchDto { defaultQuery: string; } export const SearchDtoDefaults: SearchDto = { defaultQuery: "default query" };
2. 基于TypeScriptGenerator工具配置
如果使用TypeScriptGenerator生成代码,只需在配置中开启默认值生成开关:
- 修改生成配置文件(比如
.tsgen):<TypeScriptGenerator> <GenerateDefaultValues>true</GenerateDefaultValues> <!-- 其他配置项 --> </TypeScriptGenerator>
工具会自动读取C#属性的初始化默认值,同步生成到TS文件中。
3. 手动维护常量(适合小型项目)
若不想调整工具配置,可手动同步两边的常量:
- 先在C#中把默认值抽成独立常量:
public static class SearchConstants { public const string DefaultQuery = "default query"; } public class SearchDto { public string DefaultQuery { get; set; } = SearchConstants.DefaultQuery; } - 再在TS中手动定义对应的常量:
export const SearchConstants = { DefaultQuery: "default query" };
注意这种方式需要人工同步两边值,适合默认值数量少、变动频率低的场景。
4. 自定义T4模板生成
如果团队用T4模板自定义生成逻辑,可以在模板中通过反射读取C#属性的默认值,再输出到TS里。示例模板片段:
<# foreach (var prop in dtoProperties) { #> <#= prop.Name.ToCamelCase() #>: <#= prop.TypeName #> = <#= GetDefaultValue(prop) #>; <# } #>
自行实现GetDefaultValue方法解析C#属性的初始化值即可。
内容的提问来源于stack exchange,提问作者Jan Martin
相关产品推荐
相关产品推荐

