値のとりうる形をしぼる

INPUT · スライド

any を避けて unknown を使う

01 / 05

`any` は「見なくていい」という宣言

型が分からないとき、any と書くとエラーは消える。でも消えたのはエラーだけで、問題は残ったままだよ。

any を書いた場所では、TypeScript は何も見てくれなくなる。ありもしないメソッドを呼んでも通してしまうんだ。下のコードは型の検査を通って、動かしたときに落ちる。

const atai: any = "ゆい";console.log(atai.toFixed(2));

実行結果

TypeError: atai.toFixed is not a function

02 / 05

`any` はまわりにも広がる

any の値をほかの変数に入れると、そこも見てもらえなくなる。1か所書いた any が、下流の検査までまとめて止めてしまうんだ。

下のコードは文字列を number の変数に入れているのに、何も言われない。動かすと NaN が出る。

const atai: any = "ゆい";const kazu: number = atai;console.log(kazu * 2);

実行結果

NaN

03 / 05

`unknown` は「まだ分からない」

代わりに使うのが unknown だよ。「今は何か分からない」という意味で、どんな値でも入れられる。

ちがうのは出すときだ。unknown のままでは、ほかの型の変数に入れさせてくれない。

const atai: unknown = "ゆい";const moji: string = atai;

実行結果

型のエラー: 型 'unknown' を型 'string' に割り当てることはできません。

04 / 05

たしかめれば使える

unknown も、typeof でたしかめれば中で使えるようになる。前のレッスンでやった絞りこみと同じやり方だよ。

2つのちがいは一言で言える。anyたしかめなくても通すunknownたしかめないと通さない

const atai: unknown = "ゆい";if (typeof atai === "string") {  console.log(atai.length);}

実行結果

2

05 / 05

迷ったら `unknown`

中身が分からないものを受け取るときは unknown にしておこう。使う前に必ずたしかめる形になるので、確かめ忘れようがなくなる

ここから書いてみよう。any は書かなくていいよ。

function dasu(atai: unknown): void {  if (typeof atai === "number") {    console.log(atai * 3);  } else {    console.log("すうじではない");  }}dasu(7);dasu("なな");

実行結果

21
すうじではない