type unknown,
本文带你比较一下TypeScript中的unknown和any,说说unknown和any的区别。希望对你有帮助!
我们知道任何类型的变量都可以赋给任何值。
设myVar:any=0;
myVar= 1
myVar=falseTypeScript指南并不鼓励使用any,因为使用它会丢掉类型限制——而对类型限制的需求是我们选择TypeScript的原因之一,所以恰恰背道而驰。
TypeScript(3.0及以上版本)还提供了与any相似的特殊类型unknown。我们也可以将任何值赋给未知的类型变量:
设myVar:unknown=0;
myVar= 1
myVar=false现在有一个问题。任何和未知有什么区别?
1. unknown vs any
为了更好地理解unknown和any之间的区别,让我们从编写一个想要调用其唯一参数的函数开始。
我们将invokeAnything()的唯一参数设置为任意类型。
函数invokeAnything(callback: any) {
回调();
}
invokeAnything(1);//抛出“type error:callback not a function”因为回调参数是任意类型,所以callback()语句不会触发类型错误。我们可以用any类型的变量做任何事情。
但是运行会抛出运行时错误:typeerror: callback不是函数。1是一个数字,不能作为函数调用。TypeScript不保护代码免受此错误的影响。
这不仅允许invokeAnything()函数接受任何类型的参数,而且还强制对参数进行类型检查以防止上述错误。我们做什么呢
有请 unknown 大哥来控场。
和any一样,未知变量接受任何值。但是,当您尝试使用未知变量时,TypeScript会强制进行类型检查。这就是我们想要的。
函数invokeAnything(回调:未知){
回调();
//对象属于“未知”类型
}
invokeAnything(1);因为回调参数的类型未知,所以callback()语句有一个类型错误:对象属于“未知”类型。与任何情况相反,TypeScript保护我们不调用可能不是函数的东西。
在使用未知类型的变量之前,需要检查其类型。在这个例子中,我们只需要检查callback是否是一个函数类型。
函数invokeAnything(回调:未知){
if(回调类型===函数){
回调();
}
}
invokeAnything(1);
2. unknown 和 any 的心智模式
说实话,我学习的时候很难理解未知。它与any有何不同,因为两种类型都接受任何值?
以下是帮助我理解两者区别的规则:
您可以将任何内容赋给未知类型,但是在类型检查或类型断言之前,您不能对未知类型进行操作。您可以将任何内容分配给any类型,也可以对any类型进行操作。上面的例子只是说明了unknown和` any 之间的异同。
未知示例:
函数invokeAnything(回调:未知){
//任何东西都可以赋给未知类型,
//但是在类型检查或类型断言之前不能操作unknown。
if(回调类型===函数){
回调();
}
}
invokeAnything(1);//您可以将任何内容赋给“unknown”类型检查回调的类型===function ,并检查回调是否为函数。如果有,可以调用。
任何例子:
函数invokeAnything(callback: any) {
//您可以对“any”类型执行任何操作
回调();
}
invokeAnything(1);//您可以将任何内容分配给“any”类型。如果回调是any,TypeScript不会强制callback()语句进行任何类型检查。
3.总结
unknown和any是两种可以保存任何值的特殊类型。
建议使用unknown而不是any,因为它提供了一个更安全的类型——如果要对unknown进行操作,必须使用类型断言,或者将其缩小到特定类型。
有关编程的更多信息,请访问:编程视频!这就是TypeScript中unknown和any的区别的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。