unknown

unknown 即未知类型,它是一种顶部类型。它可以像 any 类型那样作为所有类型的父类型,所有类型的值都可以赋给 unknown 类型的变量,但它不会绕过编译检查,因此比 any 类型更安全。

例如,以下代码声明了一个 unknown 类型的变量 a,任何类型的值都可以赋给变量 a

let a: unknown;
a = 1;
a = "hello";
a = true;
a = [1, 2, 3]
a = function () { console.log("hello") };
a = { x: "aa", y: 1 };

unknown 表示未知类型,如果没有显式判断 unknown 的具体类型就直接进行操作,将引起编译错误。示例代码如下。

let a: unknown;

a = function () { console.log("hello"); }
//编译错误:此表达式不可调用。类型 "{}" 没有调用签名。ts(2349)
a();

a = 1;
//编译错误:运算符"+"不能应用于类型"unknown"和"2"。ts(2365)
let b = a + 2;

a = { x: "hello" }
//编译错误:类型"unknown"上不存在属性"x"。ts(2339)
a.x