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

如何关闭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?对应OpenAPI Integer类型且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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:55:42