網站搜尋

TypeScript 支援帶有物件初始化器的建構子嗎?


例如,在 C# 中,我們有這段程式碼:

 class OrderLine
    {
        public OrderLine(){
          OrderId ="1",
          ItemTitle ="2"
        Console.WriteLine("constructing");
        }
        public string Platform { get; set; }
        public string OrderId { get; set; }
        public string ItemTitle { get; set; }
    }

    public static void Main()
    {
        var ol = new OrderLine 
        {
                Platform ="p"
        };
        Console.WriteLine(ol.Platform); 
    }

在 Typescript 中,如果我使用 {} 來初始化一個物件,我將無法呼叫構造函式,該構造函式可以給我一些預設值並做其他事情。如果我使用 new 關鍵字進行一些預設建構,我的編譯器不允許我使用物件初始化器(我正在使用 Angular 6),我必須呼叫 ol.Platform 來分配屬性值。當我有多個屬性需要設定值時,寫多個 "ol." 沒有使用物件初始化語法快。是否有更好的方法?

答案#1

你可以讓建構函數接受一個物件,然後使用 Object.assign 將其每個屬性分配給這個實例:

type Init = {
    age: number;
    gender: string;
};
class Foo {
    public name: string;
    public age: number | undefined;
    public gender: string | undefined;
    constructor(name: string, init?: Partial<Init>) {
        this.name = name;
        if (init) {
          Object.assign(this, init);
        }
    }
}
const f = new Foo('bob', { age: 10 });

答案#2

將此添加到原始答案中...

你可以將 init 定義為相同的類型,即 Partial<Foo>

@RoutingKey('abc')
class Foo {
    public name: string | undefined;
    public age: number | undefined;
    public gender: string | undefined;
    constructor(init?: Partial<Foo>) {
        if (init) {
            Object.assign(this, init);
        }
    }
}

const foo = new Foo({ name: 'something' });

這對我很有用,因為我必須呼叫 new 才能觸發建構子裝飾器 @RoutingKey()