在下面的示例中,Promise::then
訪問者函數f
有望收到Example
。如果我顯式傳遞一個缺少屬性的格式錯誤的對象,我會得到一個類型錯誤。爲什麼沒有在打字稿中檢查頭等功能?
但如果我只是傳遞函數f
到.then(f)
我沒有得到任何類型的錯誤,即使打字稿知道在Promise<T>
的T
的類型不是Example
。
interface Example {
id: number
age: number
}
interface Promise <T> {
then <U> (f: (a: T) => U) : Promise<U>
}
function f(s:Example){
return s.age
}
var p : Promise<{ id: number }>
p.then(f) // no type error (bad)
p.then(function(a){
f(a) // type error (good)
})
我想知道爲什麼會發生這種情況,但也有技術來緩解Typescript中的寬容類型檢查。
如果雙變量解釋了這種現象,那麼當明確應用f
時爲什麼會出現類型錯誤?爲什麼他們的第一類函數與顯式應用程序有不同的規則?
可能的重複:http://stackoverflow.com/questions/38699449/compatible-types-in-functions/38700451#38700451。另請參見[類型檢查不穩定性:在TypeScript團隊/社區中標準化處理此類問題](https://github.com/Microsoft/TypeScript/issues/9825) – artem
@artem我不認爲這是由於雙變量。但我可能是錯的。 –