Tkr Blog

TypeScriptのArray#filterでType Guard(Like Smart Cast)する

2017/09/10 typescript

普通に書く

let arr1:(number|string)[]=['a','b','c',1,2,3];
let arr2=arr1.filter(x=>typeof x==='string');

arr2にはstringしか入ってないはずなのに型は(number|string)[]になってしまいます。

型ガード

let arr2 = arr1.filter<string>((x): x is string => typeof x === 'string');

これでarr2はstring[]になります。

注意

let arr2=arr1.filter<number>((x): x is number => typeof x === 'string');

このような事をしてもコンパイルエラーにはなりません。 arr2の実際の型はstring[]なのにTypeScriptはnumber[]と認識します。 キャストと同じように危険な操作なので注意しましょう。

他のライブラリ

immutable.jsやrxjsでも似たような事を出来ます。


kgtkr
Web Developer.