Answers:
您可以unknown
在PR或RC公告中了解更多信息,但是要点是:
[..] unknown是任何类型安全的对应物。任何东西都可以分配给未知对象,但是除了本身以及没有类型声明或基于控制流的缩小对象之外,任何东西都不能分配给其他对象。同样,在未声明或缩小为更具体的类型之前,不允许对未知数进行任何操作。
一些例子:
let vAny: any = 10; // We can assign anthing to any
let vUnknown: unknown = 10; // We can assign anthing to unknown just like any
let s1: string = vAny; // Any is assigable to anything
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)
vAny.method(); // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable
建议的用法是:
很多时候,我们想在TypeScript中描述功能最差的类型。这对于希望表示“可以是任何值,因此在使用它之前必须执行某种类型的检查”的API很有用。这迫使用户安全地检查返回的值。
unknown
与object
@nawfal 进行比较是公平的,尽管我认为我从互变和协方差的角度看待您所得到的信息(例如,object
尽管可以为unknown
任何对象或基元分配对象,但可以将任何对象分配给type)-类似地,unknown
可以分配给any
或本身,object
也可以分配给dynamic
或本身。unknown
顺便说一句,我不清楚为什么TS文档被称为顶级类型,因为它实际上并不包含所有类型__(ツ)_ /¯
未知与任意之间的区别描述为:
很像
any
,任何值都可以分配给unknown
;但是,与不同any
,您不能访问类型为的值的任何属性unknown
,也不能调用/构造它们。此外,类型值unknown
只能分配给unknown
或any
。
要回答何时应使用unknown
over的问题any
:
这对于想要表示“可以是任何值,因此在使用前必须执行某种类型的检查”的API很有用。这迫使用户安全地检查返回的值。
查看TypeScript 3.0公告,了解有关检查类型变量的类型的示例unknown
以及更详细的说明。
any
类型:该any
类型表示所有可能的JS值。每个类型均可分配给type any
。因此,类型any
是类型系统的通用超类型。TS编译器将允许对typed的值进行任何操作any
。例如:
let myVar: any;
myVar[0];
myVar();
myVar.length;
new myVar();
在许多情况下,这对于TS编译器来说太宽容了。也就是说,它将允许我们可能会导致运行时错误的操作。
unknown
类型:该unknown
类型表示(就像一样any
)所有可能的JS值。每个类型均可分配给type unknown
。因此,类型unknown
是类型系统(以及any
)的另一个通用超类型。然而,TS编译器不会允许在输入值的任何操作unknown
。此外,unknown
类型只能分配给type any
。一个例子将阐明这一点:
let myVar: unknown;
let myVar1: unknown = myVar; // No error
let myVar2: any = myVar; // No error
let myVar3: boolean = myVar; // Type 'unknown' is not assignable to type 'boolean'
// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
any
喜欢dynamic
和unknown
一样object
。我喜欢,unknown
因为它更安全。令人困惑的名字。