このコードは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'.
'HTMLFontElement'から' Node'に 'find'の推定戻り型を変更したコミットは次のとおりです:[一般的なコンテキスト署名を持つラムダの一般的な型を推測する](https://github.com/Microsoft/TypeScript /コミット/ 872e916019a1a6cd33e03c1837569d4845c54576)(2.4.1でリリース)。タイプガードからの推論への影響が意図的であったかどうかは分かりません - そこに問題を投稿することをお勧めします。 – artem
これは既知の問題です。[2.7で修正される可能性があります](https://github.com/Microsoft/TypeScript/pull/17600)。その間に、このコードをコンパイルするには、Fentonの答えで示唆されているように明示的な型パラメータを追加する必要があります: 'nodes.find((n):nはHTMLFontElement => ...)' –
artem