01 / 05
まず `typeof` を思い出そう
string | number のままでは、文字列のメソッドを呼べなかった。でも、たしかめてからなら使えるんだ。
typeof は値の種類を文字で返す JavaScript の書き方だったね。文字列なら "string"、数値なら "number" が返ってくる。
console.log(typeof "ゆい");console.log(typeof 7);実行結果
string number
値のとりうる形をしぼる
INPUT · スライド
01 / 05
string | number のままでは、文字列のメソッドを呼べなかった。でも、たしかめてからなら使えるんだ。
typeof は値の種類を文字で返す JavaScript の書き方だったね。文字列なら "string"、数値なら "number" が返ってくる。
console.log(typeof "ゆい");console.log(typeof 7);実行結果
string number
02 / 05
typeof の結果を if の条件に書くと、TypeScript はその中を「文字列だと分かっているところ」として扱ってくれる。だから length も呼べるようになる。
人間がふつうに書く条件分岐が、そのまま型の情報として読み取られるんだ。これを絞りこみと呼ぶよ。
function dasu(m: string | number) { if (typeof m === "string") { console.log(m.length); }}dasu("ぱんだ");実行結果
3
03 / 05
2つのうち片方でないと分かれば、残るのはもう片方だ。だから else の中では m は数値になる。
* 2 のような計算も、そこでは書けるようになるよ。
function dasu(m: string | number) { if (typeof m === "string") { console.log(m + "です"); } else { console.log(m * 2); }}dasu("ゆい");dasu(4);実行結果
ゆいです 8
04 / 05
たしかめずに片方だけの操作を書くと、これまでどおり止まる。
エラーが出たら「まだ絞りこんでいないよ」という合図だと思ってほしい。if を1つ足せば通るようになる。
function dasu(m: string | number) { console.log(m * 2);}実行結果
型のエラー: 算術演算の左辺には、'any' 型、'number' 型、'bigint' 型、または列挙型を指定する必要があります。
05 / 05
「まだ無いかもしれない」型にも同じやり方が使える。たしかめた中だけで中身を使い、else で無かったときの処理を書く。
ここから書いてみよう。使う前にたしかめる、それだけだ。
type Namae = string | undefined;function yobu(m: Namae) { if (typeof m === "string") { console.log(m + "さん"); } else { console.log("なまえ無し"); }}yobu("ゆい");yobu(undefined);実行結果
ゆいさん なまえ無し