根据他们的wiki, TypeScript 3.0引入了未知类型:
Unknown现在是一个保留类型名,因为它现在是一个内置类型。 根据unknown的预期用途,可能需要删除 完全声明(支持新引入的未知类型),或者 将其重命名为其他内容。
未知和任何的区别是什么?什么时候用unknown代替any?
根据他们的wiki, TypeScript 3.0引入了未知类型:
Unknown现在是一个保留类型名,因为它现在是一个内置类型。 根据unknown的预期用途,可能需要删除 完全声明(支持新引入的未知类型),或者 将其重命名为其他内容。
未知和任何的区别是什么?什么时候用unknown代替any?
当前回答
你可以在PR或RC公告中阅读更多关于未知的信息,但其要点是:
(. .unknown,它是any的类型安全对应物。任何东西都可以赋值给unknown,但是unknown不能赋值给任何东西,只能赋值给它自己和没有类型断言或基于窄化的控制流的any。同样,如果不首先断言或缩小到更特定的类型,则不允许对未知类型进行任何操作。
举几个例子:
let vAny: any = 10; // We can assign anything to any
let vUnknown: unknown = 10; // We can assign anything to unknown just like any
let s1: string = vAny; // Any is assignable 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和any的区别如下:
就像any一样,any值可以赋值给unknown;但是,与any不同的是,您不能访问类型未知的值上的任何属性,也不能调用/构造它们。此外,unknown类型的值只能赋值给unknown或any。
要回答你什么时候应该用unknown代替any的问题:
这对于想要发出“这可以是任何值”信号的api非常有用 在使用它之前,您必须执行某种类型的检查”。这就迫使 用户可以安全地自省返回值。
看看TypeScript 3.0公告中关于类型检查未知变量的例子,以及更详细的解释。
你可以在PR或RC公告中阅读更多关于未知的信息,但其要点是:
(. .unknown,它是any的类型安全对应物。任何东西都可以赋值给unknown,但是unknown不能赋值给任何东西,只能赋值给它自己和没有类型断言或基于窄化的控制流的any。同样,如果不首先断言或缩小到更特定的类型,则不允许对未知类型进行任何操作。
举几个例子:
let vAny: any = 10; // We can assign anything to any
let vUnknown: unknown = 10; // We can assign anything to unknown just like any
let s1: string = vAny; // Any is assignable 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非常有用。这迫使用户安全地自省返回的值。
任何类型:
any类型表示所有可能的JS值。每个类型都可以赋值给类型any。因此any类型是类型系统的通用超类型。TS编译器将允许对any类型的值进行任何操作。例如:
let myVar: any;
myVar[0];
myVar();
myVar.length;
new myVar();
在很多情况下,这对TS编译器来说太宽松了。也就是说,它将允许我们已经知道会导致运行时错误的操作。
未知的类型:
未知类型表示(就像任何)所有可能的JS值。每个类型都可以赋值给未知类型。因此,类型unknown是类型系统的另一个通用超类型(与any并列)。但是,TS编译器不允许对未知类型的值进行任何操作。此外,未知类型只能赋值给类型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:
允许被分配给任何类型 允许调用任何方法
无名:
不允许被赋给任何类型 不允许调用任何方法
const a: any = 'a'; // OK
const b: unknown = 'b' // OK
const v1: string = a; // OK
const v2: string = b; // ERROR
const v3: string = b as string; // OK
a.trim() // OK
b.trim() // ERROR
公认的答案是“未知,它是any的类型安全对应物。”
然而,正如这个例子所示,unknown是它自己的野兽,有时它的行为与其他动物非常不同:
type Foo = unknown extends string ? true : false // false
type Bar = any extends string ? true : false // boolean - i.e. both true and false