2015-01-04 136 views
4

問題:打字稿類:靜態和繼承

  1. 是我觀察了打字稿的預期行爲的行爲?
  2. 我正在觀察ECMAScript 6的預期行爲?
  3. 有沒有一種簡單的方法來回顧繼承層次來處理每個級別的'myStatic'數組?我怎麼知道何時停止?

描述:當使用TypeScript時,派生類和靜態屬性似乎有一些有趣的行爲。

TypeScript Example

class MyBase { 
    static myStatic = []; 
} 

class MyDerived extends MyBase {} 

MyBase.myStatic = ['one', 'two', 'three'] 

class MyDerived2 extends MyBase {} 

document.body.innerHTML += "<b>MyDerived.myStatic:</b>&nbsp;" + JSON.stringify(MyDerived.myStatic) + "<br/>"; 
document.body.innerHTML += "<b>MyDerived2.myStatic:</b>&nbsp;" + JSON.stringify(MyDerived2.myStatic) + "<br/>"; 

這是結果:

MyDerived.myStatic: [] 
MyDerived2.myStatic: ["one","two","three"] 

編輯:添加例子說明打字稿和ECMA腳本6.注意之間不同的行爲:ECMA腳本不支持靜態屬性,所以這些示例使用靜態方法。

打字稿代碼:

class MyBase { 
    static myStatic() { return []; } 
} 

class MyDerived extends MyBase {} 

MyBase.myStatic =() => { return ['one', 'two', 'three']; } 

class MyDerived2 extends MyBase {} 

document.body.innerHTML += "<b>MyDerived.myStatic:</b>&nbsp;" + JSON.stringify(MyDerived.myStatic()) + "<br/>"; 
document.body.innerHTML += "<b>MyDerived2.myStatic:</b>&nbsp;" + JSON.stringify(MyDerived2.myStatic()) + "<br/>"; 

打字稿結果:

MyDerived.myStatic: [] 
MyDerived2.myStatic: ["one","two","three"] 

ECMA腳本6代碼:ES6 Fiddle

class MyBase { 
    static myStatic() { return []; } 
} 

class MyDerived extends MyBase {} 

MyBase.myStatic =() => { return ['one', 'two', 'three']; }; 

class MyDerived2 extends MyBase {} 

console.log("MyDerived.myStatic: " + JSON.stringify(MyDerived.myStatic())); 
console.log("MyDerived2.myStatic: " + JSON.stringify(MyDerived2.myStatic())); 

ECMA腳本6個結果

MyDerived.myStatic: ["one","two","three"] 
MyDerived2.myStatic: ["one","two","three"] 

回答

1

我正在觀察TypeScript的預期行爲? 我正在觀察ECMA Script 6的預期行爲?

是的,是的。類允許運行時修改並按定義順序處理。 inherit只在定義點開始,因此取決於基點在該點的屬性

0

See related TypeScript bug report

這裏是具有一致的行爲,並走在繼承層次打字稿和ES6代碼示例:

打字稿代碼:

class MyBase { 
    static myStatic() { return []; } 
} 

class MyDerived extends MyBase { 
    static myStatic() { return ['mickey', 'goofy', super.myStatic()]; } 
} 

MyBase.myStatic =() => { return ['one', 'two', 'three']; }; 

class MyDerived2 extends MyBase { 
    static myStatic() { return ['mickey', 'goofy', super.myStatic()]; } 
} 

document.body.innerHTML += ("MyDerived.myStatic: " + JSON.stringify(MyDerived.myStatic()) + "<br/>"); 
document.body.innerHTML += ("MyDerived2.myStatic: " + JSON.stringify(MyDerived2.myStatic()) + "<br/>"); 

打字稿結果:

MyDerived.myStatic: ["mickey","goofy",["one","two","three"]] 
MyDerived2.myStatic: ["mickey","goofy",["one","two","three"]] 

ES6代碼:ES6 Fiddle

class MyBase { 
    static myStatic() { return []; } 
} 

class MyDerived extends MyBase { 
    static myStatic() { return ['mickey', 'goofy', super.myStatic()]; } 
} 

MyBase.myStatic =() => { return ['one', 'two', 'three']; }; 

class MyDerived2 extends MyBase { 
    static myStatic() { return ['mickey', 'goofy', super.myStatic()]; } 
} 

console.log("MyDerived.myStatic: " + JSON.stringify(MyDerived.myStatic())); 
console.log("MyDerived2.myStatic: " + JSON.stringify(MyDerived2.myStatic())); 

ES6結果

MyDerived.myStatic: ["mickey","goofy",["one","two","three"]] 
MyDerived2.myStatic: ["mickey","goofy",["one","two","three"]]