如何关闭NSwag.TypeScript生成器将引用类型标记为可空的功能?
问题与解决方案:NSwag生成TS类型时仅关闭引用类型可空标记
问题场景
在.NET 6应用中使用NSwag.CodeGeneration.TypeScript生成前端TypeScript类型文件,当前配置如下:
var settings = new TypeScriptClientGeneratorSettings { GenerateClientClasses = false }; settings.TypeScriptGeneratorSettings.TypeStyle = TypeScriptTypeStyle.Interface; settings.TypeScriptGeneratorSettings.TypeScriptVersion = 3.5M; settings.TypeScriptGeneratorSettings.DateTimeType = TypeScriptDateTimeType.String; var generator = new TypeScriptClientGenerator(document, settings); var code = generator.GenerateFile();
遇到的问题:
- 所有.NET引用类型(即便原本非可空)都被转换为TypeScript的可空/可选属性
- 值类型的可空处理正常,但设置
settings.TypeScriptGeneratorSettings.MarkOptionalProperties = false后,所有可空属性(包括值类型)的可空标记都会被移除
需求:仅关闭生成的TypeScript中引用类型的可空标记,保留值类型的可空处理逻辑。
可行解决方案
方案1:自定义Schema处理器(推荐)
通过NSwag的SchemaProcessor拦截OpenAPI Schema生成流程,针对引用类型单独调整可空属性,不影响值类型的处理:
var settings = new TypeScriptClientGeneratorSettings { GenerateClientClasses = false }; settings.TypeScriptGeneratorSettings.TypeStyle = TypeScriptTypeStyle.Interface; settings.TypeScriptGeneratorSettings.TypeScriptVersion = 3.5M; settings.TypeScriptGeneratorSettings.DateTimeType = TypeScriptDateTimeType.String; // 添加自定义Schema处理器,区分引用类型和值类型的可空处理 settings.SchemaProcessors.Add((schema, context) => { // 仅处理.NET引用类型对应的OpenAPI Object类型Schema if (schema.Type == JsonObjectType.Object && !context.Type.IsValueType) { foreach (var property in schema.Properties.Values) { // 若属性为非可空的引用类型,强制关闭可空/可选标记 if (property.Type == JsonObjectType.Object && !property.IsNullable) { property.IsNullable = false; property.IsOptional = false; } } } }); var generator = new TypeScriptClientGenerator(document, settings); var code = generator.GenerateFile();
逻辑说明
- 处理器会识别.NET引用类型对应的OpenAPI
Object类型Schema - 遍历该Schema下的所有属性,仅对非可空的引用类型属性,关闭
IsNullable和IsOptional标记,避免生成TS可空语法 - 值类型(如
int?对应OpenAPIInteger类型且IsNullable=true)的可空标记会被正常保留
方案2:后期修改生成的TS代码
若不想修改NSwag生成逻辑,可在生成TS代码后,通过正则替换清理引用类型的可空标记:
var code = generator.GenerateFile(); // 移除引用类型的可选标记(如将 `?: string` 改为 `: string`) code = Regex.Replace(code, @"(\w+):\s?(\w+)\?", @"$1: $2"); // 移除引用类型的|null标记(如将 `string | null` 改为 `string`) code = Regex.Replace(code, @"(\w+):\s?(\w+)\s*\|\s*null", @"$1: $2");
注意事项
- 需根据实际生成的TS代码调整正则规则,避免误替换值类型的可空标记(如
number | null)
内容的提问来源于stack exchange,提问作者Maurice Klimek
相关产品推荐
相关产品推荐

