TypeScript 之 any vs unknown

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

前言

TypeScript 是对于 JavaScript 的超集,我们能通过 TypeScript 来发现编译时错误,以保证我们的代码是绝对安全的,而不是在运行时才来产生报错。

但是 TypeScript 提供了一个 any 类型,这个类型可以跳过 类型检查器 的检查,轻松的实现 AnyScript

在之后的版本当中,TypeScript 也发现了 any 的权利过于巨大,会产生很多的问题,“TS编译过不了怎么办,干any就完事了”,这种问题,所以在之后的版本,TypeScript 推出了 unknown 这个类型,那么 unknownany 有什么不同的地方呢? 本文就稍微的聊一聊两者的区别所在。

本文就不聊两个类型都是什么了,这些网上介绍很多,主要来说说两个类型的共同的和不同点,以及,知道这些有什么用呢?

相同点

anyunknown 都是 Top Type

可以接收任何值作为他们的参数

比如:

let a: any = "asdasddsa" || 112 || {asds:2} || Symbol()
//...其他任何类型
  
let b: unknown = "asdasddsa" || 112 || {asds:2} || Symbol()
//...其他任何类型 

就说明两个类型都是包容万物,就像是我们平时写 JavaScript 一样,一个变量你想要它在什么时候等于什么值都是可以的

let a: any = "asdasddsa" || 112 || {asds:2} || Symbol()
  
let b: unknown = "asdasddsa" || 112 || {asds:2} || Symbol()

a = Symbol()
b = Symbol() 

区别

两者不同的地方在于, 被赋予 any 类型的变量将会跳过类型检测,但是 unknown 不会。

any 类型 我们可以简单的给一个定义:“I don’t care”,简单的说就是我不在意,因为any 类型并不会经过 类型检查器,所以它毫不在意你给它的是什么类型,或者说它要用在什么地方。

unknown 类型 我们也可以简单的给一个定义:“I don’t know”,简单的说就是我不知道,作为和 any 类型一样的 Top Type ,我们可以给unknown 类型赋值任何类型,但是你要是想要拿它来做一些事的时候,对不起,他都是不允许的,因为,它不知道啊,它不知道它能不能完成你交给它的任务,所以,它就会给出报错。

any 类型 可以赋值给任何类型,任何类型也可以赋值给 any 类型 因为它完全不在意。

但是 任何值都可以赋给unknown 类型,unknown 类型却不能赋值给 unknownany 以外的任何类型,因为它不知道,它不知道它和你将要赋给的那个变量是不是安全的,打个比方:

let any1:any
let str:string = '2'
  
any1=str
str=any1 

any 类型的随便赋值都是可以实现的,但是看unknown 类型

let str:string = '2'

let unknown1:unknown

unknown1=str

str=unknown1 //err:Type 'unknown' is not assignable to type 'string'. 

编译就会给出报错,字符串不能够赋值一个unknown 类型的值,因为编译器它不知道你能不能赋值给字符串,所以给出了报错。

那么上面那段代码,要怎么才能够通过编译呢,很简单,它不知道它是什么类型,就要由程序员来告诉它:

let str:string = '2'
let unknown1:unknown

unknown1=str 

if(typeof unknown1 == 'string'){
  str=unknown1 //ok
} 

我们可以使用类型守卫,或者是其他的任何方式,只要是你能够满足你要执行的代码的约束,比如说你要赋值给字符串,那你就一定也要是一个字符串,你要调用,那你就得是一个方法,以此类推。

这样做之后,虽然我们用了 Top Type 但是还是能够保证写出来的代码足够安全,起码不是产生那种,传一个字符串却拿来当方法调用这种情况。

体操一下

前面介绍了两种类型,那么来做一些简单的体操,第一个是,我们要怎么判断一个类型它是否是 any 类型。第二个,我们要怎么判断一个类型是否是 unknown 类型

IsAny

这里我们要用到一个 any 类型 的特性,那就是any 类型和任何类型的交集,都是any:

type Z1 = any & 1            // any
type Z2 = any & '1'          // any
type Z3 = any & {a:1}        // any
type Z4 = any & unknown      // any
type Z5 = any & null         // any
type Z6 = any & undefined    // any 

当然这是只有 any 才满足的一个特性,那么我们就可以利用这个特性来判断,一个数它是不是 any

type IsAny <T> = 0 extends 1&T ? true: false

type W1 = IsAny<undefined> // false
type W2 = IsAny<any>       // true 

只有当传入的 泛型 T 是 any 的时候,他才能够满足后面为 any ,这个条件类型的 0 或者 1 并不重要,重要的是,只有当 T 是 any 的时候,前后才能够满足,这样我们就能够判断一个类型是否是 any

IsUnknown

我最开始自己思考这个问题的时候,发现了 unknown 的一个特性,就是unknown和任何类型的并集都是unknown,除了 any:

type Z1 = unknown | 1            // unknown
type Z2 = unknown | '1'          // unknown
type Z3 = unknown | {a:1}        // unknown
type Z4 = unknown | unknown      // unknown
type Z5 = unknown | null         // unknown
type Z6 = unknown | undefined    // unknown
type Z7 = unknown | any          // any 

那么我们是不是可以按照上上面的思路,最后只要排除掉 any 就好了。

这里还有一个知识点,就是 keyof anystring | number | symbolkeyof unknownnever 我们可以以此来判断。

type IsUnknown <T> = 0 extends 1|T ? 
  keyof T extends never? true: false
  : false

type e = IsUnknown<1> 

后面发现我想的太麻烦了,我们之前说过 unknown 类型却不能赋值给 unknownany 以外的任何类型,所以我们可以用这点来优化一下

type IsNotAny<T> = 0 extends 1 & T ? false : true ;
  
type IsUnknown<T> = unknown extends T ? IsNotAny<T> : false;
  
type Test1 = IsUnknown<any>     // false
type Test2 = IsUnknown<unknown> // true 

通过判断传入的类型是不是作为unknown 的父集,这样就能够把范围缩小到 unknownany,再通过上一个判断是否是 any 的工具类型,就能够更简单的实现了。

总结

今天简单的介绍了 anyunknown类型,知道了它们之间的区别,所以在我们日常的开发当中,对一个变量的类型不确定的话,可以先尝试着用 unknown 类型,只有在实在是没办法的时候才使用 any 类型

OpenHarmony—TypeScriptArkTS约束说明 由于该API的常见使用场景在静态类型语言中没有意义,因此,ArkTS不支持Symbol()API。在ArkTS中,对象布局在编译时就确定了,且不能在运行时被更改。为了节省大家一些查找的时间,这边联合几位行业大佬,为大家准备了一份《OpenHarmony4.0&Next》的学习导图,从入门到进阶再到南北向开发实战的一整套完整体系,想要学习了解更多鸿蒙开发的相关知识可以借鉴:《那么要想成为一名鸿蒙高级开发,以上知识点是必须要掌握的,除此之外,还需要掌握一些鸿蒙应用开发相关的一些技术,需要我们共同去探索。 阅读详情

相关推荐

59 ArkTS 与TS区别

ArkTS 是基于 TypeScript 开发的框架,但是有一些限制和差异。ArkTS 旨在提供更严格的类型检查和优化的代码性能,同时确保与 HarmonyOS 的开发环境和特性兼容。

I_did_it的博客 2157

Use explicit types instead ofany“, “unknown(arkts-no-any-unknown)ArkTSCheck>

您应该根据这个变量实际存储的数据来指定一个确切的类型,比如。例如,如果您有一个变量,原本被定义为。这样可以增强代码的类型安全性和可读性。这个提示是建议您在代码中避免使用。类型,而是使用更明确的具体类型。或者您自定义的类型等。

hqy1989的博客 8384

TypeScript类型系统:从基础到高级应用

类型系统是现代编程语言的核心机制,通过在编译时检查变量类型,能有效预防运行时错误。TypeScript作为JavaScript的超集,其静态类型检查机制为前端开发提供了强大的安全保障。从基础类型如string、number到高级类型anyunknown和never,TypeScript的类型系统既能处理简单数据类型,也能应对复杂场景。在工程实践中,合理使用类型推断与注解可以提升代码可维护性,而VS Code的类型提示功能则大幅提升开发效率。特别是在处理JSON数据解析和边界条件时,unknown和neve

weixin_30301449的博客 380

类型“unknown”上不存在属性“foreach”_TypeScript 类型进阶

转自 Typescript 类型进阶 https://juejin.im/post/6876698583426007053#heading-43这篇文章将通过简单实例介绍开发中常见的问题,希望能帮助你更好理解 Typescript。由于介绍 Typescript 基础知识的文章很多,官方文档本身也很全面,关于 Typescript 的基础本文就不再赘述。为什么要使用 Typescript...

weixin_39817012的博客 7990

TypeScriptunknownany 有啥区别

作者:Ashish Lahoti 译者:前端小智 来源:dmitripavlutin 有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 我们知道 any 类型的变量可以被赋给任何值。 let myVar: any = 0; myVar = '1'; myVar = false; TypeScript 指南并不鼓励使用 a.

粉丝们务必加入微信粉丝群 411

TS--面试

枚举(Enum)是 TypeScript 提供的一种数据结构,用来组织一组具有明确含义的常量值。它让这些常量具备统一的命名空间,同时在运行时会生成一个真实的对象。TS 自动根据赋值或函数返回值进行类型判断。通过 if、in、instanceof、typeofunknown/union 变成更具体的类型。可以,有可选:在类型层处理参数,提升复用性。

kangxiao17的博客 621

TypeScriptunknownany 有啥区别(1)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!

csdnlaoban的博客 666

TypeScriptanyunknown与never类型的深度解析与应用

TypeScript作为JavaScript的超集,其强大的类型系统是提升代码质量的核心机制。类型安全通过编译时检查预防运行时错误,其中顶级类型anyunknown、底部类型never构成了类型系统的关键支柱。any允许绕过类型检查,适合遗留代码迁移;unknown强制显式类型验证,是处理动态数据的理想选择;never表示不可能存在的值,常用于异常处理和类型运算。理解这些特殊类型的差异,能帮助开发者在类型安全与开发效率间取得平衡,特别适用于API响应处理、错误边界定义等场景。通过类型保护与条件类型的组合运

weixin_30781107的博客 638

AnyUnknown 和 Void:特殊类型的用法

在前几期中,我们已逐步构建了对 TypeScript 基本类型的理解,包括数字、字符串、布尔,以及数组和元组的处理。今天,我们将转向一些特殊类型:anyunknown 和 void。这些类型在 TypeScript 的类型系统中扮演着独特角色,它们不是日常数据表示的工具,而是处理不确定性、兼容性和函数行为的机制。我们将从 any 类型的便利与风险入手,逐步探讨 unknown 作为其安全替代品的优势,以及 void 在函数返回中的应用。通过详细示例和实际场景,我们旨在帮助您避免类型系统中的常见陷阱,确保代

zimin的专栏 1279

TypeScriptunknownany 有啥区别(1),web应用开发相关技术

正值金三银四招聘旺季,很多小伙伴都询问我有没有前端方面的面试题,特地整理出来赠送给大家!资料领取方式:点击这里前往免费获取可以扫码获取!!(备注:前端)**正值金三银四招聘旺季,很多小伙伴都询问我有没有前端方面的面试题,特地整理出来赠送给大家!资料领取方式:点击这里前往免费获取资料领取方式:点击这里前往免费获取。

2401_84092542的博客 963

TypeScriptany的罪与罚:为什么要避免使用any

TypeScript中的any类型会破坏类型安全,导致运行时错误和维护困难,相比之下,unknown类型更安全,要求在使用前进行类型检查。

wuhen_n的博客 769

TypeScript——基本类型一

anyunknown、boolean与类型字面量

商务合作欢迎私信我 1万+
上一篇: three.js案例解析之天空
下一篇: TypeScript自学课(5)-使用TSC编译TS
web老猴子
博客等级 码龄4年 160粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值