Programming Field

unknown - TypeScriptキーワード一覧

スポンサーリンク

「unknown」キーワードは「(実際には何かの型かもしれないが)不明な型」である「unknown 型」を表す型として用いられます。

TypeScript 3.0 で導入されています。

概要

(特筆の無いものは 「TypeScript PR #24439: New 'unknown' top type」での説明によります。)

キーワード情報

詳細

「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 型になる