Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【TypeScript】TS类型断言-类型的声明和转换(七)

【TypeScript】TS类型断言-类型的声明和转换(七)

原创
作者头像
can4hou6joeng4
发布于 2023-11-28 06:30:36
发布于 2023-11-28 06:30:36
88900
代码可运行
举报
运行总次数:0
代码可运行

前言

--

为什么要有断言这个概念?TS中并不能判断在使用联合类型时具体是那种类型?当我们不知道是什么类型的情况下要使用某个类型特有的属性或者方法,那么就可以用断言来实现,它实际上是对编辑器做了提前告知的行为,但是并不能保证运行中报错。主要有两种方式来实现,具体如下:

断言形式


(1)尖括号形式

语法:<type>+value,尖括号中填写具体的类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//anyValue是any类型,在使用时候将其断言为string类型
let anyValue:any = 'zhangsan';
let length:number = (<string>anyValue).length;//0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//anyValue是string或者number联合类型,在使用时候将其断言为string类型
let anyValue:string | number = 'zhangsan';
let length:number = (<string>anyValue).length;//0

使用断言虽然能避免编译中的报错,但是却避免不了运行中的报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type ClaaM = number | string;
function func(val:ClaaM):string{
   return  (<string>val).substr(0,1)
}
func(1)

我们可以看到编辑器中没有报错,如下: 但是编译成JS后,运行过程中就报错了,所以除非确切的知道变量的数据类型,否则不要使用类型断言,这是因为类型断言会让 TypeScript 编译器将变量当做指定的类型,而不管它实际的类型,在程序运行时可能有类型错误,断言需要慎用

(2)as形式(推荐)

语法:value as type,as后跟具体类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let anyValue:any = 'zhangsan';
let length:number = (anyValue as string).length;//0

断言类型


(1)非空断言

含义:非空断言用!表示,它用来断定某变量一定不是 nullundefined。 如果不做非空判断则会直接报错,具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type ClassTime = () => number;
const start = (ClassTime: ClassTime | undefined | null)=> {
        let time = ClassTime(); 
}

做了非空断言,则报错信息就没有了,函数在执行的时候会忽略undefined、null.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type ClassTime = () => number;
const start = (ClassTime: ClassTime | undefined | null) {
        let time = ClassTime!(); 
}

这里出一个面试题,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 面试题  
const a: number | undefined = undefined;
const b: number = a!;//这里使用断言无效,a已经有明确的值
console.log(b);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 上面的代码会编译成
const a = undefined;
const b = a;
console.log(b); // undefined

注意:只有在strictNullChecks开启时,TS才会报错,怎么开启呢?以VScode编辑器为例

  • 点击设置按钮后,选择设置选项
  • 搜索strictNullChecks,然后勾选下面的选项就可以啦

(2)肯定断言-肯定化保证赋值

含义:允许在实例属性或者变量声明后面放置一个 !号,从而告诉 TS该属性会被明确地赋值。 错误示范,我们在对变量赋值之前就使用变量,就会报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let score: number;
startClass();
console.log('' + score); // 使用前赋值
function startClass() {
    score = 5;
}

编辑器中会直接报错,我们可以在变量声明的时候就告诉编辑器该属性一定会被赋值,即在变量名后面加个!符号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let score!: number;
startClass();
console.log('' + score); // 使用前赋值
function startClass() {
    score = 5;
}

(3)将任何类型断言为any

为什么会有这种需求呢?比如以下案例:我们知道obj一定是有值的,请求接口后赋值给obj,所以一定是有值的,但是我们直接赋值,就会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj = {};
obj.name = 'zhangsan';
obj.age = 19;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj:Object = {};
(<any>obj).name = 'zhangsan';
(<any>obj).age = 19;

(4)调用函数时将参数和返回值断言成精确的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function func(val:any):any{
    return 1
}
func(1)

调用函数时我们改成以下所示,这样方便我们维护代码,约束了传参和函数返回值,不能any走天下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let data = <number>func(<string>'zhangsan')

编译成JS如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function func(val) {
    return 1;
}
var data = func('zhangsan');

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TypeScript类型声明
本文主要讲解TypeScript的基本数据结构,主要包括JS基本数据类型以及TS特有的数据类型。
不叫猫先生
2023/11/22
7270
TypeScript类型声明
typescript基础笔记
typescript早在2013年就发布了第一个正式版本,印象中一直到了19年才大火起来。三年过去了,一直是可用可不用的状态,于是很多人都没学习使用。直到react和vue开始捆版上了ts,前端圈也开始了“内卷”,ts已经是不得不用的状态了。
wade
2022/03/28
8040
TypeScript基础知识
TypeScript是JavaScript的一个超集,支持ECMAScript6标准。
岳泽以
2022/11/22
2.5K0
TypeScript基础知识
【TypeScript】TS进阶-泛型(十)
为什么要引入泛型的概念呢?其实简单来讲就是为了实现复用,让模块可以支持多种类型数据 ,让类型声明和值一样,可以被赋值和传递。 泛型是什么呢?它可以说是一种类型占位符,也可以说是类型变量,需要注意的是它一种特殊的变量,只用于表示类型而不是值。我们在定义函数、接口或类的时候,不预先指定具体类型,而是在使用的时候再指定类型,先站住位置再说,保证了输入输出保持一致的问题。 这里举个例子说明为什么要使用泛型。我们写一个函数实现返回传递参数的值,并且打印这个值,参数类型为string,返回值类型也是string,保证输入输出保持一致。
can4hou6joeng4
2023/11/28
2550
【TypeScript】TS类型声明(四)
any在使用过程中就像一个潘多拉魔盒,即使使用了断言,也丧失了在静态类型检查阶段发现错误的可能性。
can4hou6joeng4
2023/11/28
3610
TS 进阶 - 类型基础
在 TypeScript 中,null 和 undefined 类型是有具体意义的类型。在没有开启 strictNullChecks 检查时,会被视为其他类型的子类型,如 string 类型会被认为包含了 null 和 undefined。
Cellinlab
2023/05/17
2.1K0
TypeScript泛型
为什么要引入泛型的概念呢?其实简单来讲就是为了实现复用,让模块可以支持多种类型数据 ,让类型声明和值一样,可以被赋值和传递。
不叫猫先生
2023/11/15
3060
TypeScript泛型
前端应该掌握的Typescript基础知识
js 是一门动态弱类型语言, 我门可以随意的给变量赋不同类型的值 ts 是拥有类型检查系统的 javascript 超集, 提供了对 es6 的支持, 可以编译成纯 javascript,运行在任何浏览器上。 TypeScript 编译工具可以运行在任何服务器和任何系统上。TypeScript 是开源的。
前端老鸟
2022/03/07
7350
TypeScript 官方手册翻译计划【二】:普通类型
在这一章中,我们的内容会涉及到 JavaScript 代码中最常见的一些数据类型,同时也会解释这些类型在 TypeScript 中的对应描述方式。本章节并不会详尽介绍所有类型,在后续章节中我们还会介绍更多命名和使用其它类型的方法。
Chor
2021/11/29
2.5K0
基本类型_TypeScript笔记2
JavaScript有7种类型:Boolean、Number、String、Undefined、Null、Object,以及ES6新增的Symbol
ayqy贾杰
2019/06/12
8480
Typescript真香秘笈
本文由 IMWeb 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。 1. 前言 2018年Stack Overflow Developer的调研(https://insights.stackoverflow.com/survey/2018/)显示,TypeScript已经成为比JavaScript更受开发者喜爱的编程语言了。 之前我其实对于typescript没有太多好感,主要是认为其学习成本比较高,写起代码来还要多写很多类型声明,并且会受到静态类型检查
用户1097444
2022/06/29
6K0
Typescript真香秘笈
TypeScript基本语法使用
用户11325910
2024/10/31
2050
TypeScript 终极初学者指南
大家好,我是 ConardLi,在过去的几年里 TypeScript 变得越来越流行,现在许多工作都要求开发人员了解 TypeScript,各大厂的大型项目基本都要求使用 TypeScript 编写。
ConardLi
2022/04/08
7.2K0
TypeScript 终极初学者指南
typescript笔记1 环境配置 数据类型
附加到接受单个参数并返回布尔值的函数,范围值为true时,会把变量类型范围缩小为某具体类型
路过君
2022/04/13
4760
typescript笔记1 环境配置 数据类型
TypeScript
接口(interface)可以用于对【对象的形状(Shape)】进行描述,当然也可以使用interface 描述 class
九旬
2020/10/23
2K0
TypeScript
TS 常见问题整理(60多个,持续更新ing)
不应该在模块中使用命名空间或者说将命名空间导出: 使用命名空间是为了提供逻辑分组和避免命名冲突,模块文件本身已经是一个逻辑分组,并且它的名字是由导入这个模块的代码指定,所以没有必要为导出的对象增加额外的模块层。
coder_koala
2020/03/03
15.9K0
TS 常见问题整理(60多个,持续更新ing)
typeScript学习总结(一)
最近在学习typeScript,因为公司估计需要使用。同样是学习笔记,写文章的意图就在于复习总结一下之前的学习,顺带着积累写文章的感觉,在这个人人都是自媒体的时代,也能不被落的太远。
张宗伟 plus
2022/10/28
8110
typeScript学习总结(一)
开心的档之TypeScript 变量声明
声明变量没有设置类型和初始值,类型可以是任意类型,默认初始值为 undefined:
iOS程序应用
2023/03/24
9210
TypeScript 快速入门
由于这种强弱类型之分根本不是某一个权威机构的定义,一般描述强类型有更强的类型约束,而弱类型中几乎没有什么约束。
用户3045442
2020/08/06
1.7K0
TypeScript 快速入门
TypeScript
TypeScript中的Object类型并不单指普通的对象类型,而是泛指非原始类型,也就是对象,数组和函数
conanma
2021/10/28
1.9K0
相关推荐
TypeScript类型声明
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验