2017-04-08 31 views
1

如果用戶忽略了類成員屬性的默認值,是否有任何方法?如果省略,可能會讓TypeScript類的可選屬性回到默認值?

我有constains另一個類的可選實例的自定義類:

export class MyClass1 { 
    constructor() { 
     this.name = ""; 
     this.classInstance = new MyClass2(); 
    } 
    name: string;   // name of the object 
    classInstance?: MyClass2; 
} 

class MyClass2 { 
    constructor() { 
     this.name = "MyClass2 initial name"; 
    } 

    name: string; 
} 

MyClass1的內容來自JSON,所以有時一些成員變量Children子可不確定。在這些情況下,我希望MyClass1構造函數啓動新的MyClass2()classInstance成員變量。

我這是怎麼分配創建MyClass1的實例:

let myNewClass: MyClass1 = { 
    name: "MyClass" 
} 

因爲Children子被忽略,我認爲它會在構造函數中設置的默認值。然而,這種情況並非如此。我也嘗試從classInstance -variable中刪除可選符號,但這會產生編譯錯誤,因爲此時對象必須與MyClass1的結構相匹配。我想我不設法通過轉換錯誤編譯,但它並沒有解決這個問題(雖然我不知道這是否正確編譯其一):

let myNewClass: MyClass1 = { 
    name: "MyClass" 
} as MyClass1 

在兩宗個案中,Children子得到默認值構造函數設置,它出來null/undefined。

對於我來說,如何解決鑄造問題(無論是設置屬性可選還是使用鑄造)並不重要,只要我可以控制默認值即可。

回答

1

這裏的問題是

let myNewClass: MyClass1 = { 
    name: "MyClass" 
} as MyClass1 

這裏是MyClass1實例。 TypeScript類型系統被認爲是普通對象是MyClass1實例。

它將被轉錄到var myNewClass = { name: "MyClass" }MyClass1類沒有實例化。故事的結局。

做預期的事情的正確方法是從JSON向類構造函數提供值。考慮到對象屬性(classInstance)可以是undefined,類屬性不能依靠默認值等constructor({ classInstance = new MyClass2 }) { ... },應該手動分配:

export class MyClass1 { 
    constructor(jsonMyClass1: MyClass1 = {}) { 
     const { name, classInstance } = jsonMyClass1; 
     this.name = 'name' in jsonMyClass1 ? name : ""; 
     this.classInstance = 'classInstance' in jsonMyClass1 ? classInstance : new MyClass2; 
    } 
    name: string; 
    classInstance?: MyClass2; 
} 

let myNewClass: MyClass1 = new MyClass1({ 
    name: "MyClass" 
}); 

當數據被提供,並與將如何由類消耗處理記(即使用null專爲值未定義),配方可以進行修改,以使用由語言提供的權力:

export class MyClass1 { 
    constructor(jsonMyClass1: MyClass1 = {} as MyClass1) { 
     const { name = "", classInstance = new MyClass2 } = jsonMyClass1; 
     this.name = name; 
     this.classInstance = classInstance; 
    } 
    name: string; 
    classInstance: MyClass2; 
} 

let myNewClass: MyClass1 = new MyClass1({ 
    name: "MyClass", 
    classInstance: null 
}); 
+0

這樣一個完整的答案,謝謝!我只是想問一下這個問題:'const {title =「」,classInstance = new MyClass2} = jsonMyClass1;'這個語法做了什麼?這是否意味着第一個標題和classInstance被分配了值,那麼jsonMyClass1中的字段會覆蓋可用的值?但是,如果創建了一個對象,只需在下一行輸入'this.title = title;',如何訪問這些變量?我對語法有點困惑,我從未見過它。你聲明const變量,這就是我所理解的,但我不明白它是一個對象還是單獨的變量? –

+0

不客氣。這是[解構](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)。它創建'title'和'classInstance'臨時變量,它是爲var提供默認值的最簡潔的方式(如果prop不存在於jsonMyClass1對象或未定義的)。另一種方法是編寫像'this.classInstance = jsonMyClass1.classInstance!== undefined? jsonMyClass1.classInstance:新的Class2'。你可以隨時查看它在http://www.typescriptlang.org/play/上的轉換,這是一個學習TS的好方法。 – estus

+0

謝謝!嗯,我遇到了另一個有關構造函數的問題:如果classInstance是MyClass1會怎麼樣?我該如何確保數據通過嵌套子類的構造函數傳遞? 例如,JSON來通過包含: '{名字:「在主級MyClass1的實例」,Children子是:{title:「MyClass1的實例嵌套」}}' 我怎樣才能確保也MyClass1的嵌套被創建與構造函數?我從json收到整個對象,所以在這種情況下我是否可以控制它的創建方式? –

相關問題