gpt4 book ai didi

c# - 是否可以使 typescript-ref DTO 生成器尊重可为 null 的属性?

转载 作者:行者123 更新时间:2023-12-02 09:22:34 25 4
gpt4 key购买 nike

我正在尝试使用 ServiceStack 中的 typescript-ref 实用程序实现有效的 DTO 生成。问题是:对于可为空和引用属性,它不会生成默认值定义。

DTO 有 C# 定义:

public class Data
{
public int Value { get; set; }
public int? OptionalValue { get; set; }
public string Text { get; set; }
}

生成的 typescript DTO 将如下所示:

export class Data
{
public value: number;
public optionalValue: number;
public text: string;

public constructor(init?: Partial<Data>) { (Object as any).assign(this, init); }
}

这会导致静态检查问题。您将无法为这些属性设置 undefinednull 值(无论选择什么来表示 C# null 值)。由于 Partial 构造函数,可以省略它们,但仍然不方便。

此外,TypeScript 编译器不会知道这些字段可能具有未定义的值 - 这就是我们将完全失去对这些 DTO 的静态检查的地方。

我发现MakePropertiesOptional: True documented option这将使生成的 DTO 中的每个属性都是可选的。但这并没有解决我的问题,反而导致更多问题。有没有更灵活的方法来解决?

我需要为上面的类生成 DTO,如下所示:

export class Data
{
public value: number;
public optionalValue?: number;
public text?: string;

public constructor(init?: Partial<Data>) { (Object as any).assign(this, init); }
}

最佳答案

我在最新的 ServiceStack v5.8.1 pre-relase now on MyGet 中改进了对此的支持.

默认实现现在应该为 Nullable 属性生成可选的 TypeScript 属性。因此默认情况下它将生成:

export class Data
{
public value: number;
public optionalValue?: number;
public text: string;

public constructor(init?: Partial<Data>) { (Object as any).assign(this, init); }
}

要只需要特定属性,而所有其他属性都是可选的,您可以启用 MakePropertiesOptional: True 选项,然后使用 [Required] 属性标记哪些属性是必需的,例如:

public class Data
{
[Required]
public int Value { get; set; }
public int? OptionalValue { get; set; }
public string Text { get; set; }
}

这将生成您想要的:

export class Data
{
// @Required()
public value: number;

public optionalValue?: number;
public text?: string;

public constructor(init?: Partial<Data>) { (Object as any).assign(this, init); }
}

使所有引用可为空属性可选且值类型为必需的另一个选项是使用新的IsPropertyOptional过滤器,例如:

TypeScriptGenerator.IsPropertyOptional = (generator, type, prop) => 
prop.IsValueType != true || prop.Type == typeof(Nullable<>).Name;

或者使用新的PropertyTypeFilter,您可以使每个属性都可为空,例如:

TypeScriptGenerator.IsPropertyOptional = (generator, type, prop) => false;

TypeScriptGenerator.PropertyTypeFilter = (gen, type, prop) =>
gen.GetPropertyType(prop, out var isNullable) + "|null";

现在您设置的配置是:

TypeScriptGenerator.UseNullableProperties = true;

这会将每个属性生成为可为空,例如:

export class Data
{
public value: number|null;
public optionalValue: number|null;
public text: string|null;

public constructor(init?: Partial<Data>) { (Object as any).assign(this, init); }
}

关于c# - 是否可以使 typescript-ref DTO 生成器尊重可为 null 的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61078146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com