2012-11-03 64 views
2
var opts: {n?: number; s?: string;}; 
opts = {n: 2};  // Ok 
opts = {s: 'x'}; // Ok 
opts = {};   // Ok 
opts = {z: 3};  // Ok, but shouldn't this be an error? 

我想opts對象接受沒有或任何聲明 可選屬性(但沒有其他人)的,但它接受其他不確定 性質即聲明等效於opts: {};,這是 一個錯誤?爲什麼未聲明的對象屬性未標記爲錯誤?

如果它不是一個錯誤,你怎麼能構造這樣一個聲明?

回答

2

TypeScript的美妙之處在於它在決定對象是否可以被強制轉換爲另一種類型時非常聰明。

您對opts的聲明實際上沒有要求,因爲兩個屬性都是可選的,所以任何對象都與此類型兼容。爲了兼容,對象必須包含所有必需的屬性 - 在這種情況下,沒有必需的屬性。

這是清晰的,如果我們看看這確實需要的屬性調整的例子:

var opts: {a: bool; n?: number; s?: string;}; 

opts = {a: true, n: 2};  // Ok 
opts = {a: true, s: 'x'}; // Ok 
opts = {a: true};   // Ok 
opts = {a: true,z: 3};  // Ok 
opts = {}; // not ok 
opts = {z: 3}; // not ok 

因此,這意味着,如果它支持至少所需的對象被認爲是一種分型另一個對象屬性。

這涉及設置對象。現在,如果您考慮使用該對象,您將會看到權力所在。由於類型只承諾ns(在我的示例中爲a),因此n上的代碼調用屬性只能請求這些屬性。該附加屬性不能被訪問:

var opts: {a: bool; n?: number; s?: string;}; 

opts = {a: true, n: 1, s: 'Hi', z: 3}; 

var x - opts.z; // not ok 

所以我們還是有類型安全的,因爲我們只能使用在類型聲明的屬性 - 而不是附加屬性。

+0

很好的答案,謝謝。 –

+0

「因此任何對象都與此類型兼容」 不完全。例如,類型仍然會要求如果存在'n'屬性,它必須是'number'類型。 – Jesse

+0

是的 - 這會使它「兼容」正確嗎? – Fenton

相關問題