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()
