unknown - TypeScriptキーワード一覧
スポンサーリンク
「unknown」キーワードは「(実際には何かの型かもしれないが)不明な型」である「unknown 型」を表す型として用いられます。
TypeScript 3.0 で導入されています。
概要
(特筆の無いものは 「TypeScript PR #24439: New 'unknown' top type」での説明によります。)
- (型としての)キーワード「unknown」(または「unknown 型」)は『型安全な any 型』にあたる型を示します。
- 「unknown 型」は最上位の型(トップ型; top type)となります。
- より具体的には、「すべての型の値は『unknown 型』に代入可能(assignable)であるが、『unknown 型』の値は明示的な型変換(型表明; type assertion)や型ガードを伴う型チェック等が無い限り『unknown 型』と『any 型』を除いて代入不可能」な型となっています。
- また、「unknown 型」に対しては型変換(表明)や型チェック(
typeof
やinstanceof
など)、および「==
」「===
」「!=
」「!==
」の各演算子を除いてあらゆる処理・演算が不可能となります。
キーワード情報
- 「unknown」は識別子としては予約されていません。(ユーザー定義の識別子として利用できます。)
- 「unknown」は型名として予約されています。(ユーザー定義の型名として利用できません。)
- これはTypeScript 3.0から適用されます。
詳細
「unknown」はTypeScript 3.0で導入された「unknown 型」を表す型名として用いられます。この「unknown 型」は「不明な何か」と考えると「any 型」に似ているように見えますが、「any 型」と大きく異なるのが「unknown 型と any 型を除いたすべての型に代入不可能(not assignable)」であるという点です。(逆に「unknown 型」へは「any 型」と同様すべての型のデータが代入可能です。)
let a: unknown; // unknown 型変数
let b1: unknown = a; // unknown 型は unknown 型に代入可能
let b2: any = a; // unknown 型は any 型に代入可能
let b3: number = a; // ERROR: TS2322: unknown 型は number 型に代入不可能
let b4: object = a; // ERROR: TS2322: unknown 型は object 型に代入不可能
let b5: {} = a; // ERROR: TS2322: unknown 型は「{}」型に代入不可能
let b6: undefined = a; // ERROR: TS2322: unknown 型は undefined 型に代入不可能
let b7: never = a; // ERROR: TS2322: unknown 型は never 型に代入不可能
// (どんなデータも unknown 型に代入可能)
a = 14; // 数値は unknown 型に代入可能
a = 'unknown?'; // 文字列は unknown 型に代入可能
a = { code: 403 }; // オブジェクトは unknown 型に代入可能
a = null; // null は unknown 型に代入可能
型がよくわからない変数に対して「any 型」を使った場合、その変数に対する型チェックが行われなくなるため、型ガードなどでチェックする前に、うっかり別の変数や引数などにその変数を指定したり、その変数に対するメンバーを参照したりして、予期しないランタイムエラーが起きる可能性がありました。そこで「unknown 型」を使うことで、型ガードを入れないとほとんどの操作でエラーになるため、うっかりによる事故をある程度軽減することができます。
function checkValue(x: unknown) { // 引数 x は unknown 型
if (typeof x === 'string') {
// ここでは x を文字列型(string 型)として利用できる
} else if (x instanceof RegExp) {
// ここでは x を RegExp オブジェクトとして利用できる
} else {
// ここでは x は依然として unknown 型なので、
// さらなる型ガードやtype assertionが無ければ x を使った操作ができない
}
}
なお、「unknown 型」とのunion type(共用体型)は「unknown 型」以外が除かれた型、すなわち「unknown 型」と同じになり、intersection type(交差型)は「unknown 型」が除かれた型と同じになります。
let p: number | unknown; // unknown 型になる
let q: number & unknown; // number 型になる
let m: null | unknown; // unknown 型になる
let n: null & unknown; // null 型になる