type unknown@TypeScript

TypeScript読み始めて、型にanyがあるのは例えばGolangの構造体にもanyがあるから、まあそうかなと思いますがunknownというのは目新しい。

以下、unknown type説明用のコードですが、unknownでも限定的な演算子はサポートしていて例えば’===’はサポートされていますが、’+’演算子に対してはまさしくunknown扱いでコンパイルエラー(VScodeなので赤アンダーライン)になります。

typeofで型を特定してやればこの例ではnumberとして扱うことができています。

以下の実行結果で違いがわかります。

// unknown type 
let aa: unknown = 10    // type safe 'any'
let cc = aa === 10      // === is usable
console.log(cc)

//let dd = aa + 20      // -> cause error
if (typeof aa === 'number'){
    let dd = aa + 20
    console.log(dd)
}


// any type
let aaa: any = 10    // type safe 'any'
let ccc = aa === 10
console.log(ccc)

let ddd = aaa + 20
ddd = aaa + 20
console.log(ddd)

<results>

% ts-node "./hello.ts"
true
30
true
30

anyは文字通りどのような型であっても設定できますが、unknownは型の特定(annotation)が必要にされる場合があるところがanyとの違いです。故にunknownはtypesafe anyと呼ばれるようです。

この辺りの仕様は最近の言語仕様だと感じるところです。

P.S. 2023/6/13 unknownの補足

unknownは型の特定が必要ということで、もしunknownの変数を扱う場合には、例えばtypeofで型の絞り込みを行えば、TypeScriptがその型を認識してくれて処理ができます。以下、unknown型をnumber型として絞り込んで処理しています。

// type of unknown
let hh: unknown = 10
if (typeof hh === "number"){
    let hh_m = hh * 3
    console.log(hh_m)
}

 

admin