Можно ли сделать DTO-генератор typcript-ref для соблюдения обнуляемых свойств? - PullRequest
3 голосов
/ 07 апреля 2020

Я пытаюсь добиться правильной генерации DTO с помощью утилиты typescript-ref от ServiceStack. Проблема в том, что для обнуляемых и ссылочных свойств не будет генерироваться определение значения по умолчанию.

Существует C# определение DTO:

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

Сгенерированный машинописный DTO будет выглядеть следующим образом:

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

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

Это приведет к проблемам проверки c. Вы не сможете установить значения undefined или null (независимо от того, какое значение будет выбрано для представления значения C# null) для этих свойств. Из-за конструктора Partial их можно просто опустить, но все же это не удобно.

Также компилятор TypeScript не будет знать, что эти поля могут иметь неопределенное значение - здесь мы потеряем данные c полная проверка этих DTO.

Я нашел MakePropertiesOptional: True документированный параметр , который сделает каждое свойство в сгенерированных 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); }
}

1 Ответ

1 голос
/ 07 апреля 2020

Я улучшил поддержку этого в последней предварительной версии ServiceStack v5.8.1 для MyGet .

Реализация по умолчанию теперь должна генерировать необязательные свойства TypeScript для свойств Nullable. Таким образом, по умолчанию теперь он генерирует:

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

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

Чтобы указать только обязательные свойства c и все другие необязательные свойства, вы можете включить опцию 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); }
}

Другой вариант сделать все свойства reference и nullable необязательные и требуемые типы значений используют новый фильтр 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); }
}
...