TypeScriptでみかける"is"というキーワードについて

TypeScriptでググっても出てこなくてよくわからないやつ。

他人が書いたTypeScriptのコード見てるとたまに

const isString = (arg: any): arg is string  => typeof arg === "string";

のように「引数 is 型」と書かれたものを見かける。

このコードは引数になんか受け取って、それがstringなのかどうかを判別するくん。

返り値の型に『arg is string』と書かれている。

この記事はこれについてのはなし。

"is" is なに…

この"is"というキーワード、ググラビリティがめちゃくちゃ低くてどうググったらいいかわからないし、ググってもあんまりそれっぽいのがヒットしなくて困る。

What is this "is" keyword?

という気持ちになる。isがゲシュタルト崩壊

"is"は型の絞り込みができる便利なやつです

結論しか書けないけど、type guardに便利な型。

挙動についてはシンプルなものは以下のような振る舞いになる

const isString = (arg: any): arg is string  => typeof arg === "string";

const foo = 'foo' as any // ここではanyとして振る舞いたまえ

if (isString(foo)) {
  // isStringの結果、arg is string = foo is string = fooはstring型であることが確定している
    foo.length // fooをas anyしたけどfooはstringとして解釈される
}

このような挙動になる。

参考情報

本件の"is"は演算子とかのページには書かれていなくて、type guard の項目にしれっと書かれている…こんなの見つけられるわけないジャン……

www.typescriptlang.org

あるいはスタックオーバーフローのこのスレが一番わかりやすい(このブログよりもね)

stackoverflow.com

まとめ

  • "is"は型の絞り込みができる
    • ランタイム時にエラーが起こるコードを未然に防げる可能性が上がる
    • 型が確定するので書き味がよい
  • 型が自然言語だからわかりやすい

TypeGuardする場面で使っていくといいという話。

スタックオーバーフローのリンク先のほうがコード例わかりやすい気がしてきたのでみなさん最後にこんなこと言ってアレなんですが、スタックオーバーフローのほうも読みましょう😅