2017-07-16 66 views
1

鑑於以下打字稿代碼如何使用TypeScript中的類使用函數重載?

class NumberChecker { } 
class StringChecker { } 
class Component {} 
class ComponentChecker { } 
class Grid { } 
class GridChecker { } 

function check(element: number): NumberChecker; 
function check(element: string): StringChecker; 
function check(element: Grid): GridChecker; 
function check(element: Component): ComponentChecker { 
    if (typeof element === 'number') { 
     return new NumberChecker(); 
    } 
    if (typeof element === 'string') { 
     return new StringChecker(); 
    } 
    if (element instanceof Component) { 
     return new ComponentChecker(); 
    } 
    if (element instanceof Grid) { 
     return new GridChecker(); 
    } 
} 

const a = check(2); // a is NumberChecker 
const b = check('sdf'); // b is StringChecker 
const c = check(new Component()); // c is GridChecker 
const d = check(new Grid()); // d is GridChecker 

爲什麼cdGridChecker?我期待cComponentChecker

Link to Playground

+1

您應該嘗試使用不同的定義。那些'Component'和'Grid'目前是兼容的。 –

+0

只是試圖給這兩個類添加不同的屬性,並得到編譯錯誤'重載簽名與函數實現不兼容'。我不知道如何解決。 – goenning

+0

但這是一個很好的觀點。每個Checker類都有不同的方法。如果我嘗試添加它們,我會遇到更多編譯錯誤。我雖然返回類型不必相互兼容。 – goenning

回答

3

實際執行的簽名需要覆蓋的選項所有,你的情況,應該是:

function check(element: number): NumberChecker; 
function check(element: string): StringChecker; 
function check(element: Grid): GridChecker; 
function check(element: Component): ComponentChecker; 
function check(element: number | string | Grid | Component) { 
    // ... 
} 

那麼對於類型:

const c = check(new Component()); 

ComponentChecker

但是,只要不同的類不具有相同的結構。

+0

太棒了,謝謝。 – goenning