你好同学,我是沐爸,欢迎点赞、收藏、评论和关注!
在TypeScript中,any
类型和unknown
类型都是用于表示不确定类型的值的,但它们之间存在关键的区别,这些区别在类型安全和编码实践中非常重要。
any
类型
- 定义:
any
类型在TypeScript中被视为一个顶级类型(super type),它可以被赋值给任何类型,也可以从任何类型被赋值。它基本上关闭了TypeScript的类型检查。 - 用途:在迁移现有JavaScript代码到TypeScript时,
any
类型非常有用,因为它允许你逐步添加类型注解,而不需要立即修复所有类型错误。然而,它应该谨慎使用,以避免失去TypeScript提供的大部分类型安全优势。 - 类型安全:使用
any
类型会显著降低代码的类型安全性,因为TypeScript不会对其进行任何类型检查。
unknown
类型
- 定义:
unknown
类型表示一个未知类型的值。与any
不同,unknown
类型的值不允许进行任何操作,除非你首先使用类型断言或类型守卫(type guard)将其转换为更具体的类型。 - 用途:
unknown
类型在TypeScript中用于表示一个完全未知的值,这在你需要处理来自不可靠源(如用户输入或第三方API)的数据时非常有用。它鼓励你显式地检查类型或断言类型,从而提高代码的安全性和清晰度。 - 类型安全:
unknown
类型提供了比any
更高的类型安全性,因为它要求你在使用未知值之前进行显式的类型检查或断言。
比较
- 类型检查:使用
any
时,TypeScript不会进行任何类型检查;而使用unknown
时,你需要显式地处理或断言类型。 - 安全性:
unknown
类型比any
类型更安全,因为它强制要求你显式地处理未知类型的值。 - 使用场景:
any
类型适用于在迁移现有代码或处理完全无法类型化的代码时使用;而unknown
类型则适用于处理来自不可信源的数据,或在你不确定值的类型时使用。
代码示例
any 类型
(1)基础示例
let a: any = 4
a = "hello"
a = false
a = [1, 2, 3]
(2)any 类型的数组
let arr: any[] = [1, true, "free"]
arr[1] = 100
(3)any 的负作用
let a: string = 'hello'
let b: any = 4
a = b // 不会报错
console.log(typeof a) // number
(4)隐式 any
// 开启严格模式也不报错
let a
// 形参 params 在开启严格模式时报错
function fn(params) {
console.log(params)
}
如果要禁用隐式 any,可在 tsconfig.json 中开启 "noImplicitAny": true
选项。
unknown 类型
(1)基本示例
let a: string = 'hello'
let b: unknown = 4
b = 'hi'
a = b // 报错
// 添加类型判断
if (typeof b === 'string') {
a = b // 不报错
}
// 添加类型断言
a = b as string // a = 4 不报错, 但a的类型变为number
a = <string>b // a = 4 不报错, 但a的类型变为number
从上面的结果可以看出,使用类型判断比类型断言更安全,使用类型断言虽然不报错,但会产生"Bug逃逸"。
(2)unknown 类型的数组
用法同 any 类型,可任意改变元素的值,而不用关注其类型。
let arr: unknown[] = [ 1, 'hello', true]
arr[0] = 'world'
arr[1] = 2
console.log(arr) // [ 'world', 2, true ]
结论
总的来说,虽然any
和unknown
都可以用于表示不确定类型的值,但unknown
类型在TypeScript中提供了更高的类型安全性和更清晰的编码实践。因此,在可能的情况下,建议优先使用unknown
类型而不是any
类型。
好了,分享结束,谢谢点赞,下期再见。