TypeScript中any类型和unknown类型有什么区别?

你好同学,我是沐爸,欢迎点赞、收藏、评论和关注!

在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 ]

结论

总的来说,虽然anyunknown都可以用于表示不确定类型的值,但unknown类型在TypeScript中提供了更高的类型安全性和更清晰的编码实践。因此,在可能的情况下,建议优先使用unknown类型而不是any类型。

好了,分享结束,谢谢点赞,下期再见。

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐爸muba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值