对于unknown
类型,我们必须先检查当前存储在变量中的类型,然后才能获得打字稿支持。
当使用any
类型时——打字稿会忽略我们所做的任何事情,任何事情都是允许的,但这不是我们大多数时候想要的,大多数时候我们仍然希望进行一些类型检查。
那是unknown
进来的时候——我们告诉打字稿,嘿我们要得到这个值,但我们不知道它的类型,所以我们只是要检查几个 if 语句来追踪它并安全地使用它,在 if 块中为我们提供了对检查的特定类型的支持。
例如,在下面的代码片段中,我们得到一个错误:
let myString: string; let remoteData: unknown; remoteData = 'hello world'; myString = remoteData;
错误的原因是myString
必须是字符串并且remoteData
是类型,unknown
因此分配失败。一个重要的区别是,如果我们使用any
而不是我们不会得到错误unknown
的类型,因为当我们使用typescript 时,不会为我们提供类型检查。remoteData
any
修复错误的方法是有条件地检查 typeof
remoteData
是否为字符串,然后才继续进行赋值:
let myString: string; let remoteData: unknown; remoteData = 'hello world'; if (typeof remoteData === 'string') { myString = remoteData; }
在if
块的范围内,remoteData 保证是一个字符串,因此我们可以访问它上面的所有字符串方法,例如
toLowerCase
。
在if
街区外,但类型仍然未知。
所以我们必须在使用类型时进行赋值和调用特定于类型的方法之前进行条件检查unknown
,它仍然提供了大量的功能和类型检查,而不是any
类型。
Unknown 是比 any 更好的类型,当我们不知道我们将获得什么类型的值时,但我们知道我们想用它做什么。在那些情况下,我们可以使用类型在条件块中获得类型支持unknown
。