“未知”与“任何”


184

unknown根据他们的Wiki,TypeScript 3.0引入了类型:

unknown现在是保留类型名称,因为它现在是内置类型。根据未知的预期用途,您可能希望完全删除声明(支持新引入的未知类型),或将其重命名为其他名称。

unknown和之间有什么区别any?我们什么时候应该unknown用完any

Answers:


227

您可以unknownPRRC公告中了解更多信息,但是要点是:

[..] 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很有用。这迫使用户安全地检查返回的值。


32
来自C#背景的任何人都any喜欢dynamicunknown一样object。我喜欢,unknown因为它更安全。令人困惑的名字。
nawfal

1
我不知道这unknownobject@nawfal 进行比较是公平的,尽管我认为我从互变和协方差的角度看待您所得到的信息(例如,object尽管可以为unknown任何对象或基元分配对象,但可以将任何对象分配给type)-类似地,unknown可以分配给any或本身,object也可以分配给dynamic或本身。unknown顺便说一句,我不清楚为什么TS文档被称为顶级类型,因为它实际上并不包含所有类型__(ツ)_ /¯
Jordan Jordan

38

未知与任意之间的区别描述为:

很像any,任何值都可以分配给unknown;但是,与不同any,您不能访问类型为的值的任何属性unknown,也不能调用/构造它们。此外,类型值unknown只能分配给unknownany

要回答何时应使用unknownover的问题any

这对于想要表示“可以是任何值,因此在使用前必须执行某种类型的检查”的API很有用。这迫使用户安全地检查返回的值。

查看TypeScript 3.0公告,了解有关检查类型变量的类型的示例unknown以及更详细的说明。


21

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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.