当前位置: 首页 > news >正文

【学员提问】对于typescript的assert和casting,即类型断言和类型转换,我还不太理解,请结合例子梳理下知识点,并且出几道题考考我

文章目录

      • 一. 类型断言 (Type Assertion)
        • 示例 1:类型断言
      • 二. 类型转换 (Type Casting)
        • 示例 2:类型转换
      • 三、两者的主要区别:
      • 四、练习题
        • 题目 1
        • 题目 2
        • 题目 3
        • 题目 4
      • 五、答案

最近有学员问我这个问题类型断言和类型转换有何区别。其实也是很多刚学ts的小伙伴经常会迷惑的问题。肝了2小时,整理出了一份笔记,供大家参考。

以下是 类型断言(Type Assertion)与类型转换(Type Casting)的区别和用法。

一. 类型断言 (Type Assertion)

类型断言是在 TypeScript 中告诉编译器,开发者更了解某个值的类型。通过类型断言,开发者可以明确告诉编译器这个值的类型,而不是让 TypeScript 推断其类型。类型断言 不会 进行实际的类型转换,它仅仅是用于编译时的检查。

语法形式:

  • 值 as 类型
  • <类型>值(这种形式主要用于旧版本 TypeScript,不推荐)
示例 1:类型断言
let someValue: unknown = "Hello, TypeScript";// 断言 someValue 是 string 类型
let strLength: number = (someValue as string).length;

在这个例子中,someValue 的类型是 unknown,我们通过 as 断言告诉 TypeScript,它实际上是一个 string,因此可以调用 string 上的属性(如 length)。

二. 类型转换 (Type Casting)

类型转换通常指的是在运行时将一种类型的数据转换为另一种类型。例如,将字符串 "123" 转换为数值 123。类型转换会发生在运行时,并且实际会改变数据的存储方式或表现形式。

语法形式:

  • 使用 Number(), String(), Boolean() 等全局对象进行转换。
示例 2:类型转换
let strValue: string = "123";// 类型转换,将字符串转换为数字
let numValue: number = Number(strValue);console.log(numValue); // 123

在这个例子中,strValue 是字符串,通过 Number() 进行类型转换,转换为数值类型。

三、两者的主要区别:

  • 类型断言:仅在编译时检查,不会改变数据的实际类型或内容,只是告诉编译器如何处理。
  • 类型转换:发生在运行时,改变数据的实际表示形式或内容。

四、练习题

题目 1

请问下面这段代码是否正确?如果不正确,请修正并解释原因。

let val: unknown = "I am a string";
let length = val.length;
题目 2

请将下面的字符串 "456" 转换为数值,并将其与数值 123 相加,打印结果。

let str: string = "456";
题目 3

在以下代码中,假设你知道 inputElement 是一个 HTML 的 <input> 元素,如何使用类型断言来正确访问其 value 属性?

let inputElement = document.getElementById('my-input');
题目 4

下面代码的 as 用法正确吗?为什么?

let someValue: any = "This is a string";
let strLength: number = <number>someValue.length;

五、答案

1、不正确。正确的代码为:

let val: unknown = "I am a string";
let length = (val as string).length;

2、答案:

let str: string = "456";
let num:number = Number(str);
let count:number=num+123;
console.log(count);

3、答案:

let inputElement:unknown = document.getElementById('my-input');
let newipt=inputElement as HTMLInputElement;
console.log(newipt.value)

4、答案:
不正确。它没有使用as关键字。在react中,可能会误认为是react的类型。

解释:
a.没有使用 as 关键字:在这段代码中使用的是 <> 语法来进行类型断言,这是 TypeScript 旧版本中的一种类型断言方式。在现代 TypeScript 中,推荐使用 as 语法来进行类型断言。

b.可能与 React JSX 冲突:在React项目中,<> 是 JSX 语法的一部分,表示一个空的 JSX 容器。因此,在 React 环境中使用 <> 语法可能会引起混淆,或者导致编译错误。为了避免这种冲突,建议使用 as 语法。

let someValue: any = "This is a string";
let strLength: number = (someValue as string).length;  // 使用 as 语法断言类型

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 普发Pfeiffer TCP600TCP5000手侧
  • CleanMyMac X2024破解版mac电脑清理工具
  • Redis 集群会有写操作丢失吗?为什么?
  • 期权组合策略有什么风险?期权组合策略是什么?
  • 110个oracle常用函数总结
  • 2024年我的利基出版转型——新战略与重点解析
  • 【4.2 深度学习中的损失函数】
  • Linux系统【RockyLinux9.4】下K8S集群【1.31.0】安装部署指南
  • 【C语言】选择题错题集
  • 干货分享 | 激光测风雷达中准确监测温度、湿度和气压的重要性
  • HTML + js 生成一个线路走向图,可以标记总共有多少站,用户到达第几站了
  • 计算机毕业设计python校园物资招标投标竞标系统 w235g
  • Vue3.0项目实战(三)——大事件管理系统首页 layout 架子与文章分类的实现
  • 解决 Ubuntu 20.04 上 Fail2Ban 启动失败问题:指定 systemd 后端
  • Python的学习(三十二)---- ctypes库的使用整理
  • 2017前端实习生面试总结
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android Volley源码解析
  • bearychat的java client
  • Lucene解析 - 基本概念
  • 构建工具 - 收藏集 - 掘金
  • 关于 Cirru Editor 存储格式
  • 基于HAProxy的高性能缓存服务器nuster
  • 普通函数和构造函数的区别
  • 前端代码风格自动化系列(二)之Commitlint
  • 深度学习中的信息论知识详解
  • 鱼骨图 - 如何绘制?
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​Redis 实现计数器和限速器的
  • # Maven错误Error executing Maven
  • #define,static,const,三种常量的区别
  • (2015)JS ES6 必知的十个 特性
  • (21)起落架/可伸缩相机支架
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (a /b)*c的值
  • (C语言)二分查找 超详细
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (LeetCode) T14. Longest Common Prefix
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (笔记)M1使用hombrew安装qemu
  • (苍穹外卖)day03菜品管理
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (转载)Linux网络编程入门
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core 项目指定SDK版本
  • .NET Core中的去虚
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET框架设计—常被忽视的C#设计技巧