2016-04-09 109 views
2

打字稿編譯器接受以下代碼而不發出錯誤信號:打字稿:在繼承的方法參數類型應被推斷

class S { 
    f(p: number) { 
     console.log(`${p + 1}`); 
    } 
} 

class C extends S { 
    f(p) { 
     super.f(p) 
    } 
} 

let a: C = new C(); 
let b: C = new C(); 

a.f(41); // -> 42 
b.f('x'); // -> x1 

打字稿是一個靜態類型語言,不應編譯器推斷的p參數類型在繼承的方法fnumber?爲什麼錯誤的鍵入的字符串值的賦值未被捕獲,產生奇怪的行爲?

回答

2
class C extends S { 
    f(p) { 
     super.f(p) 
    } 
} 

此代碼等同於下面的代碼:

class C extends S { 
    f(p: any) { // <---- parameter is 'any' 
     super.f(p) 
    } 
} 

這意味着你可以調用C#f任何參數類型。這是你的班級的有效替代,因爲派生方法的有效性是更多一般比其基本方法。

這種行爲被理解爲有點違反直覺,所以there's a feature accepting PRs for this in the language在這種情況下自動鍵入p作爲string

+1

謝謝,瑞安,我同意替換是有效的更一般的參數。雖然,恕我直言,調用'super.f(p)'不應該被允許具有未定義類型的參數(_any_)。有沒有辦法強制編譯器進行這種類型檢查? –