2017-06-03 70 views
0

是否有可能使用帶枚舉參數的重載函數執行類型推斷?例如,說我想做一個工廠函數返回類型取決於枚舉值:使用枚舉參數重載函數的類型推斷?

enum Colors { 
    Red, 
    Green 
}; 

abstract class Box { }; 
class RedBox extends Box { }; 
class GreenBox extends Box { }; 

class BoxFactory { 
    static createBox(color: Colors.Red): RedBox; 
    static createBox(color: Colors): Box { 
    switch (color) { 
     case Colors.Red: 
     return new RedBox(); 
     case Colors.Green: 
     return new GreenBox(); 
    } 
    } 
} 

function makeMeABox(color: Colors) { 
    // Argument of type 'Colors' is not assignable to parameter of type 'Colors.Red' 
    return BoxFactory.createBox(color); 
} 

playground

如果我生成一個聲明文件,一般過載甚至不顯示向上。但是,如果我刪除過載static createBox(color: Colors.Red): RedBox;,情況很好。

+0

返回類型是從來沒有考慮過,甚至像Java靜態類型語言的函數簽名的一部分和C++ – Dummy

回答

1

你只是缺少一個簽名:

class BoxFactory { 
    static createBox(color: Colors.Red): RedBox; 
    static createBox(color: Colors): Box; // <--- THIS ONE 
    static createBox(color: Colors): Box { 
    switch (color) { 
     case Colors.Red: 
     return new RedBox(); 
     case Colors.Green: 
     return new GreenBox(); 
    } 
    } 
} 

然後:

let a = BoxFactory.createBox(Colors.Red); // type of a is RedBox 
let b = BoxFactory.createBox(Colors.Green); // type of b is Box 

code in playground

+0

你的方法很好,謝謝!你能幫助我理解爲什麼我們需要額外的重載與功能簽名相同嗎?如果重載,編譯器是否不解析主函數簽名? –

+1

實際實現的簽名不是重載列表的一部分,這意味着在您的代碼中只有一個簽名(其中'color = Colors.Red'),我的代碼爲一般情況添加了第二個簽名。只是在這種情況下,實現的簽名與它匹配。 –