百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

TypeScript 的断言 typescript语言

connygpt 2024-09-25 15:45 6 浏览



●断言: 其实就是告诉 TS, 我知道我自己在做什么, 不要你管


●因为我们在 TS 的开发过程中, TS 会识别我们写的所有的内容, 然后会傻傻的根据代码去识别你写的内容
●先来看个例子吧


const box = document.querySelector('.box')
console.log(box.innerHTML)

○一段看似简单的代码, 谁都认识
○但是一旦运行起来



○这是什么鬼, 为什么会报错呢
●浅浅的解释一下

我们通过 querySelector 方法从页面上获取一个元素
这是没有问题的, 但是根据语法, 我们获取到的有可能是一个元素
也有可能是 null, 也就是页面上根本没有这个元素
但是 TS 在识别的时候, 其实是傻傻的, 不会去识别你的 html 元素, 也不会去捕获你的页面
只是单纯的看你书写的 ts 代码, 那么他就会认为, 你有可能获取不到元素
这个时候, 就会给你提示错误了
因为如果万一真的是 null, 那么肯定是不能调用 innerHTML 属性的
错误也就出现了

●当我们开发的时候, 在写代码的时候, 只要我们准确的告诉他, 我这个代码一定能获取到元素, 你不要管东管西的, 那么 TS 就不会在提示错误了

就像上面的代码, 只要你在使用 innerHTML 的时候, 准确的告诉他
我的 box 一定是一个 HTML 元素, 那么就一定能调用 innerHTML 这个属性
这个时候, TS 就不会给你提示错误了


类型断言
方式1: 利用 as 书写断言
●语法 : 数据 as 类型

const box = document.querySelector('.box')
console.log((box as HTMLDivElement).innerHTML)

方式2 : 利用 <> 书写断言
●语法 : <类型>数据


const box = document.querySelector('.box')
console.log((<HTMLDivElement>box).innerHTML)

这就是对一个数据进行类型断言
○也就是在开发的过程中
○讲某一个数据断定为某一个类型
○这样就可以直接按照该数据类型去调用属性和方法了

非空断言
●也就是在开发的过程中, 忽略有可能出现的 undefined 和 null 类型
●这里我们使用 ! 来做这个事情

const box = document.querySelector('.box')
console.log(box!.innerHTML)


●注意
当 box 只有可能是 一个内容 或者 undefined 或者 null 的时候
我们可以用 ! 进行断言, 也就是告诉他, box 不可能是 null 或者 undefined
利用 ! 排除了 undefined 和 null 的可能

确定赋值断言
●在开发中还有这样一种情况, 就是我们在初始定义某一个变量的时候, 有可能是不赋值的
●在后面的代码或者函数内对其进行赋值, 然后再使用


// 初始化的时候不进行赋值
let n: number

// 通过调用这个函数对 n 进行赋值操作
function init () { n = 100 }
init()

// 这里使用一下 x
console.log(x.toFixed(2))

○然后我们就发现, TS 又提示错误了



●这是因为 TS 不太清楚你的 init 函数调用以后会对 x 进行赋值
●所以就会告诉你, 你还没有赋值呢, 就调用了 toFixed 方法
●这个时候, 我们就可以使用确定赋值断言, 还是使用 !

// 初始化的时候不进行赋值
let n!: number

// 通过调用这个函数对 n 进行赋值操作
function init () { n = 100 }
init()

// 这里使用一下 x
console.log(x.toFixed(2))

●在初始化的时候, 给变量后面加一个 !
○也就是告诉 TS, 这个变量我一定会百分之一万赋值的, 你少管
○这样今后在遇到你使用 x 这个变量的时候
○TS 就会默认认为他一定有值
○也就不会提示错误了

const 断言
●这个有点和我们定义变量的关键字差不多, 但是又不太一样, 小伙伴不要搞混淆了哦
●我们先来看这个代码把

let n: number = 100 as const
let s: string = 'hello world' as const

○这样一来, 我们定义的 n 和 s 就不能被更改了


●我直接用 const 定义变量不好吗, 为什么 ... ( 如果不能骂街, 那我无话可说 )
●hold on ... hold on !!
●我们再来看下一段代码

const obj = { name: 'Jack', age: 18 }

○这个就是用 const 定义的一个变量, 只不过值是一个引用数据类型了
○我们的 const 只能保证 obj 不会被改变, 但是 obj 内部的子级数据是不会被限制的
○如果我们想让 obj 内的每一个成员都是只读的属性, 不允许被更改呢
○只能是在书写接口的时候, 把每一个属性都定义为 readonly
●O(∩_∩)O哈哈~, 我的 const 断言有用武之地了

const obj = { name: 'Jack', age: 18 } as const

○这样一来, 我们 obj 内 所有的子级数据就都不能被更改了


●注意:
○const : 是 ES6 中定义变量的关键字, 反应当前定义的是一个常量, 不允许被更改, 但是对于引用数据类型来说, 起子属性还是可以被修改的
○as const : TS 内的语法, 告诉 TS, 被断言的内容不管是自己本身还是其子属性都不允许被修改, TS 就会对每一个层级的数据进行最严格的判断和限制

相关推荐

3分钟让你的项目支持AI问答模块,完全开源!

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...

干货|程序员的副业挂,12个平台分享

1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...

Github标星超200K,这10个可视化面板你知道几个

在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...

开箱即用的炫酷中后台前端开源框架第二篇

#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...

搭建React+AntDeign的开发环境和框架

搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...

基于.NET 5实现的开源通用权限管理平台

??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...

StreamPark - 大数据流计算引擎

使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...

教你使用UmiJS框架开发React

1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...

简单在线流程图工具在用例设计中的运用

敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...

【开源分享】神奇的大数据实时平台框架,让Flink&amp;Spark开发更简单

这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...

聊聊规则引擎的调研及实现全过程

摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...

【开源推荐】Diboot 2.0.5 发布,自动化开发助理

一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...

微软推出Copilot Actions,使用人工智能自动执行重复性任务

IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...

Electron 使用Selenium和WebDriver

本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...

Quick &#39;n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具

一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...