Edited at

TypeScript 3.0のunknown型 - タイプセーフなany

More than 1 year has passed since last update.

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