2017-11-01 10 views
1

このコードはtypescript 2.3では正常に動作しますが、typescript 2.4では失敗します。なぜ説明できますか?typescript以来のユーザー定義型ガードの変更点2.4

testFindTypeGuard.ts:

let el: Element; 

const nodes: Node[] = []; 

const result = nodes.find((n): n is HTMLFontElement => n.nodeName === "FONT"); 

el = result; 

my.d.ts:

interface Array<T> { 
    find<U extends T>(predicate: (value: T, index: number, obj: Array<T>) => value is U): U | undefined; 
} 

エラーメッセージ:

error TS2322: Build:Type 'Node' is not assignable to type 'Element'.

+0

'HTMLFontElement'から' Node'に 'find'の推定戻り型を変更したコミットは次のとおりです:[一般的なコンテキスト署名を持つラムダの一般的な型を推測する](https://github.com/Microsoft/TypeScript /コミット/ 872e916019a1a6cd33e03c1837569d4845c54576)(2.4.1でリリース)。タイプガードからの推論への影響が意図的であったかどうかは分かりません - そこに問題を投稿することをお勧めします。 – artem

+1

これは既知の問題です。[2.7で修正される可能性があります](https://github.com/Microsoft/TypeScript/pull/17600)。その間に、このコードをコンパイルするには、Fentonの答えで示唆されているように明示的な型パラメータを追加する必要があります: 'nodes.find ((n):nはHTMLFontElement => ...)' – artem

答えて

0

期待どおりあなたの例の仕事をするためには、あなたコンパイラにUを記述する必要があります。あなたの型式ガードの適用範囲を自動的に拡大するという概念的な飛躍はありません。

if-statementの一部として型ガードを使用すると、(ifとelseの両方の)型の変更が行われます。しかし、あなたの例では、あなたがなりたい場所に到達するために型引数を渡す必要があります:

const result = nodes.find<HTMLFontElement>((n): n is HTMLFontElement => n.nodeName === "FONT"); 

コンパイラは物事が積み重ねていない場合、以下はあなたを与えるかを決定するのに十分なスマートですエラー:あなたは、コンパイラは、以前のバージョンでこののより良い仕事をしていたと思われる場合

const result = nodes.find<HTMLDivElement>((n): n is HTMLFontElement => n.nodeName === "FONT"); 

、あなたはGitHubの上の問題を提起したいことがあります...ただし、あなたmay have done so already

関連する問題