TypeScript3.0でunknown型が追加されました。
TypeScript 3.0 # New unknown top type · TypeScript
unknown型は、any型のタイプセーフ対応版のようです。unknown型には任意の値を代入できる点はany型と同一ですが、型アサーション等が無いと利用できません。
例として、String.indexOf()
メソッドをstring
でないインスタンスで実行してみます。
var one: any = 1;
var two: unknown = 2;
one.indexOf("1"); // 実行時エラー (>_<)
two.indexOf("2"); // コンパイルエラー \(^o^)/
if (typeof two === "string") {
two.indexOf("2"); // これはOK \(^o^)/
}
unknown型ならば、未知のデータを代入できるというany型の恩恵を受けつつ、型の違いによる不具合をコンパイル時のエラー($ tsc
コマンド等)で事前に検知することができ、安全になります。
Webサービスやユーザ入力値等に対する利用が想定されていて、たとえばJSON.parse()
の返り値に適用できる点が、TypeScript公式のissueでも言及されています。イメージとしてはこんな感じでしょうか。
const json: string = '{"1": "1", "2": "2"}'
const json_any: any = JSON.parse(json);
const json_unknown: unknown = JSON.parse(json);
json_any["1"] + json_any["2"] // 3ではなく"12"になってしまう (>_<)
json_unknown["1"] + json_unknown["2"] // コンパイルエラー \(^o^)/
参考: DefinitelyTyped/types/parse-json/index.d.ts
環境
- TypeScript 3.0.1