2016-09-01 73 views
1

看來我遇到了TS編譯器的一個奇怪的邊緣情況,當涉及到類型推斷時。下面的代碼(和註釋行一樣)應該(我相信)會產生一個編譯錯誤,但實際上並沒有。TypeScript多餘的字段檢查和類型推斷錯誤

interface IReturned { 
    theField?: string; 
} 
interface IFactory { 
    (): IReturned; 
} 
var factory : IFactory = function() /* : IReturned */{ 
    return { 
     BROKEN: 'ERROR' 
    } 
}; 
var instance = factory(); 
// instance.BROKEN; 

什麼理想情況下應該發生的是,工廠函數的返回類型推斷爲IReturned,這意味着它是一個編譯錯誤返回一個對象文本與它過多的領域,因此,在設置了「破」屬性應該不是有效的。

如果使用IReturned將函數顯式註釋爲其返回類型,則確實會發生這種情況。 「實例」變量的類型也被正確推斷,並且試圖訪問下面一行中的「斷開」字段也是一個錯誤。

我失去了一些東西在這裏?有沒有辦法讓這個工作無需在任何地方添加冗餘類型定義?

回答

1

它被接受,因爲它是兼容的。

假設您定義了一個擴展IReturned的接口IRet2並添加了一個字段BROKEN。因爲接口IRet2擴展IReturned,它是有效的返回IRet2類型的對象,你必須返回一個IReturned

interface IReturned { 
    theField?: string; 
} 
interface IRet2 extends IReturned { 
    BROKEN: string; 
} 
interface IFactory { 
    (): IReturned; 
} 
var factory : IFactory = function(): IRet2 { 
    return { 
     BROKEN: 'ERROR' 
    } 
}; 
var instance = factory(); 

你的代碼都遵循同樣的原則,但隱含延伸IReturned推斷類型。

相關問題