2014-09-04 61 views
0

我想我已經遇到了TypeScript的函數重載解析中的一個bug。這裏有一個例子:TypeScript函數重載Bug

class Container<T> 
{ 
    constructor(public value: T) { } 
} 

function unwrap<T>(value: Container<T>): T; 
function unwrap<T>(value: T): T; 
function unwrap(obj) { 
    if (obj instanceof Container) { 
     return obj.value; 
    } else { 
     return obj; 
    } 
} 

// Inferred type of "a" should be number, but is in fact Container<number> 
var a = unwrap(new Container<number>(1)); 
var b = unwrap(2); 
var c = a.toFixed(); // causes compile error 

通過了打字稿語言規範第4.12.1我的重載決議規則的理解,語句指定爲「A」應該使用第一展開過載,並分配到「B 「應該使用第二次過載。所以「a」和「b」都應該推斷出「數字」類型。但實際上編譯器似乎對這兩個調用都使用第二個解包超載,因此推斷的「a」類型爲Container<number>,因此對「c」的分配無法編譯。這是一個錯誤,還是我誤解了重載解析規則?

我仍然使用TypeScript 0.9.0.1的方式,因爲我的項目需要它的兼容性,所以也許這已經固定在一個新的版本?

回答