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