ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[success] # 使用unknown 还是 any ~~~ 1.区别一:any即是top type(任何类型都是他的subtype)又是 bottom type(他是任何类型的subtype), 简单说就是 '任何类型的值赋值给 any 类型的变量','可以把 any 类型的值赋值给任意类型(除 never 以外)的变量', unknown是个top type(任何类型都是他的subtype),'可以把任何类型赋值给unknown','但只能给unknown和any 类型赋值给unknown' 2.区别二:unknown 和 any 的主要区别是 unknown 类型会更加严格,在对unknown类型的值执行大多数操作之前,我们必须进行某 种形式的检查,而在对 any 类型的值执行操作之前,我们不必进行任何检查。 ~~~ >[danger] ##### 区别一 案例 ~~~ let strAny:any = "1" let num:number = 1 let boolean = true // 任何类型可以赋值给any -- top type strAny = num // any 可以赋值给任何类型 -- bottom type boolean = strAny // -------------unknown ---------------------- let strAny:unknown = "1" let num:number = 1 let boolean = true // 任何类型可以赋值给unknown -- top type strAny = num // unknown 只能赋值给unknown 和any 类型 boolean = strAny // 报错 ~~~ * unknown 报错 ![](https://img.kancloud.cn/ae/36/ae36e709b4fda647bb92a0cf9779fbc8_523x215.png) >[danger] ##### 区别二 案例 ~~~ let value: any value.foo.bar // OK value() // OK new value() // OK value[0][1] // OK let value1: unknown value1.foo.bar // ERROR value1() // ERROR new value1() // ERROR value1[0][1] // ERROR ~~~ * 它就可以缩小类型范围更加安全 ~~~ 1.下面案例如果参数是any 则不用if 判断用来缩小范围也不会报错,但是使用了'unknown' 你必须要更加精确缩小范围 使用才不会报错 ~~~ ~~~ function getValue(value: unknown): string { if (value instanceof Date) { // 这里由于把value的类型缩小为Date实例的范围内,所以`value.toISOString()` return value.toISOString(); } return String(value); } ~~~ ~~~ // 不会报错但是如果是unknown 会报错 function getValue(value: any): string { return value.toISOString(); } ~~~ >[info] ## 指鹿为马 ~~~ 1.下面案例想解决'let horse = deer as Horse // 报错' 问题有两种方法 1.1.let horse = deer as any as Horse 1.2.let horse = deer as unknown as Horse 需要向上转型在向下指定,相对来说两种虽然都可以但是 'any' 相当于直接暴力通过类型检查,打这张牌要警惕。 'unknown' 是所有类型的父类型,想强行 as 的时候更建议打这张牌。 ~~~ ~~~ interface Deer { deerId: number } // 这是马 interface Horse { horseId: number } // 牵出一只鹿 let deer: Deer = { deerId: 0 } // 这样会报错,没法直接指鹿为马 let horse = deer as Horse // 报错 ~~~ >[info] ## 总结 ~~~ 1.'unknown' 是更安全的 'any', 'any' 由于过于灵活的设定,导致它与 'JavaScript' 没有太多区别,很容易产生低级错误 向案例一展示一样'unknow' 并不是可以赋值给任何类型的这样不会导致不确定性,并且案例二的展示也可以看出, 当 unknown 类型被确定是某个类型之前,它不能被进行任何操作 因此多用'unknown' 少用'any' ~~~ >[info] ## 参考文章 [# \[译\] TypeScript 3.0: unknown 类型](https://juejin.cn/post/6844903866073350151) [TypeScript 的 any 和 unknown 有什么区别,使用它们的最佳实践是怎样的?](https://www.zhihu.com/question/355283769)