TypeScript系列:unknown vs any
2024-01-03 19:44:08
在TypeScript中,any和unknown都是顶层类型,这意味着它们是所有其他类型的父类型。这两个类型非常相似,以至于在日常使用中很难界定什么时候该用any,什么时候该用unknown。这很容易导致错误和困惑。
any
any是TypeScript中最宽松的类型。它允许您将任何类型的值存储在any变量中,而不会收到任何类型错误。这使得any非常有用,例如,当您从不确定的来源接收数据时。
let data = JSON.parse(request.body);
这段代码将请求正文解析成JSON对象,并将其存储在data变量中。data的类型是any,因为我们不知道JSON对象中包含什么类型的数据。
unknown
unknown是TypeScript中相对严格的类型。它允许您将任何类型的值存储在unknown变量中,但您不能在unknown变量上调用任何方法或属性。这迫使您在使用unknown变量之前先对其进行类型检查。
let data: unknown = JSON.parse(request.body);
if (typeof data === 'string') {
// data是字符串
} else if (typeof data === 'number') {
// data是数字
} else {
// data是其他类型
}
这段代码与前一段代码相似,但这次我们使用unknown类型来存储JSON对象。我们必须在使用data变量之前先对其进行类型检查,以确定它的实际类型。
unknown与any的区别
unknown与any的主要区别在于,unknown不允许您在unknown变量上调用任何方法或属性。这迫使您在使用unknown变量之前先对其进行类型检查。这可以帮助您避免错误,并使您的代码更健壮。
另一个区别是,unknown可以与其他类型一起使用来创建更安全的类型。例如,您可以使用unknown和never来创建一种类型,该类型只能是unknown或never。这可以用于表示一个变量可以是任何类型,但它永远不会是null或undefined。
type MyType = unknown | never;
何时使用any和unknown
一般来说,您应该尽量避免使用any。只有在您确实不知道变量的类型时,才应该使用any。如果您知道变量的类型,那么您应该使用unknown或更具体的类型。
unknown非常适合用于处理来自不确定来源的数据。例如,如果您从API接收数据,那么您应该使用unknown来存储这些数据。这样,您就可以在使用数据之前对其进行类型检查,以确保您不会遇到任何错误。
结论
any和unknown都是TypeScript中非常有用的类型。然而,您应该尽量避免使用any,因为any可能会导致错误和困惑。unknown是一个更安全的类型,可以帮助您避免这些问题。