搞懂TypeScript中的类型断言和使用场景

TypeScript基础之非空断言操作符、可选链运算符、空值合并运算符 先看以下代码: 对于以上代码, TypeScript编译器会提示以下错误信息: 要解决以上问题,我们可以加个条件判断: 此外, 可以使用TypeScript2.0中提供的非空断言操作符()。 语法非空断言操作符操作符 可以用于断言操作对象是非 null 和非 undefined 类型。即: 将从 值域中排除 和 。所以以上代码可以改造为: 看下编译结果: 可以看出非空断言操作符从编译生成的JS代码中移除掉了, 如果handler函数调用时传入或时,会出现以下运行时错误: 所以在实际使用时需要注意。 阅读详情

TypeScript 的类型断言看起来概念比较简单,但是对于刚接触 TypeScript 的使用者,可能对使用场景缺少认识,希望本文可以帮助你更了解类型断言。

当你使用一个值,但是 TypeScript 不知道具体类型 或者 TypeScript 记录的类型没有办法满足使用要求时,可以使用类型断言来明确指定为自己想要使用的类型。

语法:

类型断言有两种方式:

  1. 使用 <> 语法
  2. 使用 as 关键字

<> 会和 JSX 语法冲突,一般使用 as 。

我们来看几个类型断言的示例

1.对于通过标签获取的DOM,TypeScript可以推断出类型,但是对于其他方式,TypeScript无法推断,我们可以使用类型断言来明确指定元素类型。

const aEle = document.querySelector('a') // HTMLAnchorElement | null
const canvasEle = document.querySelector('#my_canvas') as HTMLCanvasElement
React.useEffect(() => {
  if (props.autoFocus) {
    const $this = ref.current as HTMLInputElement;
    ...
  }
}, []);

AntD中的示例:ActionButton.tsx

2.对于空对象占位,可以断言为特定类型,以获取正确的代码提示和类型推断

const [user, setUser] = useState<User | null>(null);
setUser(newUser);
const [user, setUser] = useState<User>({} as User);
setUser(newUser);
const 断言

const 断言告诉编译器为表达式推断出它能推断出的最窄或最特定的类型,而不是通用类型。

// point变成一个readonly 数组类型,修改数组内容会提示错误。
let point = [3, 4] as const; // readonly [3, 4]
point[0] = 1 // Error

我们来看一个代码示例:

function useDarkMode() {
  const [mode, setMode] = React.useState<'dark' | 'light'>(() => {
    // ...
    return 'light'
  })
  ...
  return [mode, setMode] as const
}

const [mode, setMode] = useDarkMode() // 伪代码,hook需要再函数组件中使用

我们来对比一下 mode 和 setMode 使用 as const 之后的差别:

在使用 const 断言之前,mode 和 setMode 类型为:

const mode: "dark" | "light" | React.Dispatch<React.SetStateAction<"dark" | "light">>
const setMode: "dark" | "light" | React.Dispatch<React.SetStateAction<"dark" | "light">>

TypeScript中的类型断言

调用setMode时,会提示错误,因为 ‘dark’ | ‘light’ 并不是可调用类型。

TypeScript中的类型断言

使用 as const 断言之后,mode 和 setMode 类型为:

const mode: "dark" | "light"
const setMode: React.Dispatch<React.SetStateAction<"dark" | "light">>

image-20220726173035919

image-20220726173102524

调用传参错误时,也会有类型错误提示。

image-20220726173131771

可以看到,对于数组来说,每个元素的类型是整个数组元素类型的联合类型

const arr = [1,'2'] 
// const arr: (string | number)[]

使用 as const 断言之后,数组会变成 readonly 数组且每个元素有了自己的特定类型,也有了更好的错误提示。

再来看一个 rxjs 中的示例:fromEvent.ts

// These constants are used to create handler registry functions using array mapping below.
// 这些常量用于使用下面的数组映射创建处理程序注册表函数
const nodeEventEmitterMethods = ['addListener', 'removeListener'] as const;
const eventTargetMethods = ['addEventListener', 'removeEventListener'] as const;
const jqueryMethods = ['on', 'off'] as const;

使用 as const之后,类型检测更为严格:

  • readonly 数组,每个元素都有自己的字面量类型,无法调整为其他值,杜绝被意外修改的可能
  • 在访问数组元素或进行数组解构时,因数组长度固定,避免越界,更不容易出错

const 断言和 typeof 搭配使用:useSelection.tsx

字符串使用 as const 之后,变量就有了字面量类型,typeof 操作符可以提取其字面量类型使用。

export const SELECTION_ALL = 'SELECT_ALL' as const;
export const SELECTION_INVERT = 'SELECT_INVERT' as const;

export type INTERNAL_SELECTION_ITEM =
  | SelectionItem
  | typeof SELECTION_ALL
  | typeof SELECTION_INVERT;

TypeScript 只允许类型断言为一个更具体或者更不具体的类型,这个规则可以阻止一些错误的强制类型转换:

const x = "hello" as number;
// Error:将 'string' 类型转换为 'number' 类型可能是一个错误,因为这两种类型都没有充分重叠。如果这是故意的,请先将表达式转换为“unknown”。

我们再来看一个 Antd 中的使用示例: back-top

React.useEffect(() => {
  bindScrollEvent();
  return () => {
    if (scrollEvent.current) {
      scrollEvent.current.remove();
    }
    (handleScroll as any).cancel();
  };
}, [props.target]);

handleScroll 是一个函数,但是其他文件中被增加了 cancel 属性,此处直接调用 cancel 方法, TypeScript会提示错误,可以断言为 any 来规避 TypeScript 的类型检查

双重断言

对于我们已经明确的变量类型,如果不存在重叠,可以先断言为一个宽泛的类型(any、unknown),再断言为一个具体的类型。

// es default export should use const instead of let
const ExportTypography = (RefTypography as unknown) as React.FC<TypographyProps>;

Typography

注意:当使用断言时,应该确保你了解当前值的类型,避免出错。对于可以收窄的类型,尽量使用类型收窄而非断言。

深入理解 TypeScript 中的类型断言(Type Assertion) 类型断言是 TypeScript 中一个强大而独特的特性,它允许开发者告诉编译器:"我知道这个值的类型是什么,请相信我"。本文将全面探讨类型断言的概念、语法、使用场景、最佳实践以及潜在陷阱,帮助你在 TypeScript 开发中更有效地使用这一特性。 阅读详情

相关推荐

gm/Id 设计方法

本文介绍gm/Id方法的具体实现。

maxwell2ic的博客 4万+

TypeScript之类型断言

由于定义函数参数用了混合类型,里面只能访问混合类型的公共属性。当我们必须用到某个类型的独有属性时,就得使用类型断言。🟣 前端2026最新【持续更新】→。🟢 前端0到1【持续更新】→。🔵 前端进阶【持续更新】→。🔴 AI最新学习资料 →。

zhang1339435196的博客 1181

重构工业交互体验:响应式数据可视化大屏解决方案

从智慧园区到数据中心,从水务监控到风力发电场景,HT 通过 2D/3D 组态技术与响应式布局机制,让数据以更灵活、更精准的方式呈现场景动态 —— 这正是 HT 技术在工业可视化领域的核心价值。例如,在智慧楼宇监控系统中,HT 引擎可实时渲染建筑结构、设备状态与数据流,同时确保画面在不同尺寸屏幕上的一致性。以某工业数据中心大屏为例,HT 通过暗红色主调搭配工业元素,结合粉色与黄色点缀,打破传统深蓝色大屏的视觉定式,同时通过矢量图形确保色彩在不同亮度下的辨识度 —— 这正是 HT 技术在视觉设计上的独特优势。

Hightopo的博客 889

vscode报错解决 类型注释只能在 TypeScript 文件中使用

报错原因: JavaScript是弱类型动态检查语言。多数变量可以再被声明时赋值数据,故常在运行时发现代码中的错误。 解决方法: 1.在VScode中使用Ctrl+Shift+P打开搜素框,输入Preferences: Open User Settings或Preferences: Open Workspace Settings。 2.找到settings.json文件 3.点击打开后,输入"javascript.validate.enable": false即可解决 ...

weixin_46163346的博客 1万+

uniapp 实现RFID识别的实战指南

本文提供了在uniapp中实现RFID识别的完整实战指南。核心在于通过Android系统广播机制,利用uni-app的plus对象调用原生接口,完成与RFID手持设备的“软硬件握手”。文章详细介绍了从环境准备、设备选型、核心代码实现到避坑优化的全流程,帮助开发者快速构建高效的RFID盘点或管理应用。

weixin_29161719的博客 404

FPGA设计中的扇出约束实战:从XDC到代码优化的全流程解析

本文全面解析FPGA设计中扇出约束的重要性与应用,详细介绍了从XDC约束文件设置到HDL代码优化的全流程实战技巧。通过MAX_FANOUT约束控制信号负载,结合寄存器复制和物理优化策略,有效解决高扇出导致的时序违例和布线拥塞问题,提升设计性能和可靠性。

nept的博客 796

【Vite基础】003-Vite 中使用 TypeScript

推荐将这个配置写在 tsconfig.json 文件里面;Vite 提供了一些内置的对象,但默认不知道这些变量的类型,需要配置以令其显示。

訾博(ZiBo)的博客 1763

GameFramework框架详解之 框架总览

一.前言 目前市场上有很多优秀个开源框架,比如ET,GameFramework,DBFramework,StrangeIOC,Loxodon-Framework,KSFramework,xluaFramework等等。其中要说规范的话,不得不说GameFramework还是不错的,当然很多新手看到后会觉的有点复杂,写一个小小的功能,不得不套用一堆东西,继承一堆接口,感觉不知所措,不能随心所欲的去撸代码。其实这个框架就是为了约束新手的行为的,让我们面向接口编程,遵循“开闭”的设计原则来写代码,方便后期的扩

TxNet 2万+

typeScript中的类型断言

类型的变量,它们可能是由于第三方库未能定义好自己的类型,也有可能是历史遗留的或其他人编写的烂代码,还可能是受到 TypeScript 类型系统的限制而无法精确定义类型的场景。我们知道,TypeScript 是结构类型系统,类型之间的对比只会比较它们最终的结构,而会忽略它们定义时的关系。理想情况下,TypeScript 的类型系统运转良好,每个值的类型都具体而精确。类型,为了实现这样一个函数,它的参数的类型肯定得是比较抽象的父类。断言为精确的类型,亡羊补牢,使我们的代码向着高可维护性的目标发展。

qq_57423665的博客 1239

zynq的irq_f2p 如何增加或修改中断引脚个数(宽度)

ZYNQ开发过程中,如果使用PL到PS的中断,会产生一个疑问,设置界面显示可以有[91:84]、[68:61]共16个中断引脚,但是并没有设置中断口的宽度,如果使用多个中断引脚,应该怎么办?如果通过concat连接多个引脚,则自动调整为对应的引脚数。例如连接3个中断信号,则自动调整为:IRQ_F2P[2:0]

FPGA艺术家的博客 833

32、机械臂数字孪生模型创建指南

本文介绍了如何在MATLAB Simscape中为一款3自由度(DOF)微型机械臂创建数字孪生模型。内容涵盖硬件参数测量、Simulink模型搭建流程,包括初始条件设置、基座与上部主体构建、上臂结构设计等关键步骤。通过使用Solid、Revolute Joint和Rigid Transform等模块,实现机械臂多体系统建模,并支持后续运动仿真与物理系统的对比诊断。读者可依据指南逐步完成模型构建,相关资源可通过MATLAB File Exchange或指定网站获取。

qsc9012345的博客 214

【TypeScript专题】之类型断言

本篇文章是《Typescript 专题》第二篇,本篇文章主要聊一聊类型断言是什么,一句话概括就是——类型断言的目的就是让编译通过,是不是很刺激?欢迎小伙伴们积极踊跃的互动,我会及时回复的哦,下一篇我们聊一聊大家最感兴趣的`类`吧~

余光的博客 3286

液态神经网络(Liquid Neural Networks)从线虫大脑到下一代 AI

液态神经网络(Liquid Neural Networks,LNN)是一类具有动态内部结构的神经网络,其灵感来源于生物神经系统,尤其是大脑中神经元如何以复杂、非线性的方式响应外部刺激。与传统神经网络不同,液态神经网络的每个神经元在处理输入时,不再是静态线性或非线性变换,而是基于一个微分方程模型进行响应。这种建模方式使神经元的行为具有时间连续性和动态适应性。换句话说,它不仅“记住”过去的信息,还能根据当前环境实时调整自身的动态特性,这对于感知、决策、预测等任务都非常关键。

hello.reader 7408

TypeScript类型断言

TypeScript类型断言 类型断言(Type Assertion)可以用来手动指定一个值的类型 自己理解,有的时候在联合类型的时候,只能访问联合类型的共有方法或者属性,但是这个时候是不够用的。这个时候就要自己手动断言成某个类型。断言不是改变某个类型,不是类型转换。这个时候能让取到你断言成的类型的方法。更像是call或者apply function getLength(something:...

Army-海军的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【进阶】TS 中的 类型断言 和 泛型

本章内容包含: 1、类型断言,2、非空断言,3、typeof,4、keyof,5、泛型,6、泛型函数,7、泛型的问题,8、泛型接口,9、泛型工具

jiang_ziY的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TypeScript类型断言完全指南

TypeScript类型断言完全指南

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 1731

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

TypeScript 教程 第10章:类型断言与非空断言

类型断言用于显式告诉编译器某个值的具体类型,语法包括 as Type 和 <Type>,适用于处理 DOM、接口数据解析等场景。非空断言 `!` 则用于确保值不为 `null` 或 `undefined`,常见于延迟初始化或组件引用。两者都绕过类型检查,使用需谨慎,推荐优先使用类型守卫和可选链等更安全方式。结合 Vue 项目,常用于路由组件定义和异步导入增强类型提示。

silverclayz的技术分享 1810

TypeScript 类型断言、类型推论

类型断言是一种 TypeScript 特性,用于告诉编译器将一个值视为特定的类型,即使编译器本身的类型推断可能不同。类型断言并不会改变变量的实际运行时类型,而是在编译阶段告知TypeScript编译器开发者期望该表达式具有某种类型。不是 类型转换,因为。但类型断言纯粹是一个,只是在编译阶段起作用,不进行特殊的数据检查和解构,它没有运行时的影响。同时,它也是一种。当你在TypeScript里使用JSX时,只有as语法断言是被允许的。

咸鱼滚滚 1273

详解TypeScript中的类型断言及其绕过类型检查机制

非空断言运算符!可选链操作符?告诉编译器“这肯定不是 null/undefined”只有在值不为 null/undefined 时才继续访问编译器通过,但运行时有风险编译和运行都更安全应谨慎使用更推荐断言方式类型推断可否修改无 const 断言一般类型(如 string[], { x: number })可修改使用as const字面量类型 + readonly 修饰不可修改(只读)// 类型谓词: pet is Fish。

Weiki的博客 1337

TypeScript基础之类型断言

文中内容基本上参考https://ts.xcatliu.com/basics/type-assertion.html 。TypeScript中类型断言()可以用来手动指定一个值的类型,用来覆盖TS中的推断。 当 TypeScript 确定赋值无效时,我们可以选择使用类型断言来覆盖类型。 如果我们使用类型断言,赋值总是有效的,所以我们需要确保我们是正确的。否则,我们的程序可能无法正常运行。两种执行类型断言的方法:基本使用 然而,当你在JSX中使用 的断言语法时,会产生语法冲突,因此建议使用 的语法来类型断

zxl1990_ok的博客 1832

Typescript入门-类型断言讲解

TypeScript的类型断言允许开发者绕过编译器的类型推断,强制指定变量类型。它有两种语法:<Type>value和value as Type,推荐使用后者以避免与JSX冲突。类型断言需满足实际类型与目标类型兼容的条件,否则可通过双重断言as unknown as T实现无关类型的转换。特殊的as const断言能将变量视为常量,缩小类型范围至字面量值,但仅适用于字面量而非变量或表达式。类型断言虽方便,但滥用可能掩盖潜在错误,应谨慎使用。

曹定栓的博客 986

typescript 类型断言

如下,可以看到吗,不同的方法获取到的变量 ts类型推论也不一样,aLink1使用querySelector,这个方法返回文档中与指定选择器或选择器组匹配的第一个 Element对象。tips:我们大多数时候还是更多使用getElementById方法,这是因为元素的 ID 在大部分情况下要求是独一无二的,这个方法自然而然地成为了一个高效查找特定元素的方法。说人话就是,当你比编译器还要明确的知道一个值的类型的时候,可以使用类型断言来指定更具体的类型。在这种情况下就需要使用类型断言来指定更加具体的类型,

JiuMeilove的博客 1638

TypeScript之断言和类型

TypeScript 断言 3.1 类型断言 有时候你会遇到这样的情况,你会⽐ TypeScript 更了解某个值的详细信息。通常这会发⽣在你清楚地知道⼀个实体具有⽐它现有类型更确切的类型。 通过类型断⾔这种⽅式可以告诉编译器,“相信我,我知道⾃⼰在⼲什么”。类型断⾔好⽐其他语⾔⾥的类型转换,但是不进⾏特殊的数据检查和解构。它没有运⾏时的影响,只是在编译阶段起作⽤。 1. "尖括号"语法 let someValue: any = "this is a string"; let strLength: numb

学技术,用技术,学以致用 1180

TypeScript 类型断言的适用场景及代码示例

类型断言就像是你很确定某个东西是什么,然后直接告诉 TypeScript 编译器“相信我,它就是这个类型”。用大白话来说,类型断言就像是你给编译器“打个招呼”,让它相信你对变量类型的判断;而类型转换是实实在在地把一个东西变成了另一种东西。交叉类型就像是把不同的类型“拼”在一起,创造出一个包含所有类型特征的新类型。装饰器就像是给类、方法、属性等添加一些额外的功能,就像给房子装修一样,让它们变得更强大。类型断言和类型转换在概念上很容易混淆,但其实有本质区别。方法前后输出一些日志信息,方便我们调试和监控。

前端大白话 1187

TypeScript类型断言与as关键字的使用

类型断言是TypeScript提供的一种机制,允许你手动指定一个值的类型。它类似于其他语言中的类型转换,但不会进行运行时检查。这意味着,如果类型断言不正确,可能会导致运行时错误。因此,使用类型断言时应非常谨慎,并确保你知道自己在做什么。

2023年最新地推相关信息 1157

【TypeScript】类型断言的基本使用

类型断言的概念有些时候开发者比TS本身更清楚当前的类型是什么,。类型断言(Type Assertion)表示可以用来手动指定一个类型值。

如果巅峰留不住,那就重走来时路! 1683
上一篇: jsDelivr失效了,用什么免费图床比较靠谱?
下一篇: 搞懂TypeScript的类型声明的方方面面
一颗小行星!
博客等级 码龄15年 74粉丝 121原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

一颗小行星!

恰饭ing

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

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

打赏作者

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

抵扣说明:

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

余额充值