TypeScript语法详解之类型操作的补充

目录
  • 类型操作的补充
    • 类型断言的使用
    • 非空类型的断言
    • 可选链使用介绍
    • 两个特殊操作符
    • 字面量类型介绍
    • 字面量推理介绍
  • 总结

类型操作的补充

类型断言的使用

有时候TypeScript无法获取具体的类型信息,这个我们需要使用类型断言( Type Assertions)

比如我们在操作DOM的时候, 通过 document.getElementById 获取元素, TypeScript只知道该函数会返回HTMLElement ,但并不知道它具体的类型, 是无法得知具体是img还是div等等:

当我们加上类型断言后, TypeScript就可以得知具体的类型信息

const el = document.getElementById("app") as HTMLImageElement

el.src = "图片地址"

TypeScript只允许类型断言转换为 更具体 或者 不太具体(指的是any和unknown)的类型版本,此规则可防止不可能的强制转换

如下直接转是会报错的

我们可以先将message转为any或者unknown, 再转为number, 但是不推荐这样做

const message = "Hello World"
const num: number = (message as any) as number

非空类型的断言

当我们编写下面的代码时,在执行ts的编译阶段会报错

这是因为传入的message有可能是为undefined的,这个时候是不能执行方法的;

// 参数为可选类型的时候
function printMessage(message?: string) {
  console.log(message.toUpperCase())
}

printMessage("aaa")

我们确定上面代码传入的参数是有值的, 但是编译还是不通过,这个时候我们可以使用非空类型断言

非空断言使用的是 ! ,表示可以确定某个标识符是有值的,跳过ts在编译阶段对它的检测, 虽然逃过了编译阶段的检查, 但是代码依然是不严谨的;

function printMessage(message?: string) {
  // 加上 ! 代表着保证这个message一定是有值的
  console.log(message!.toUpperCase())
}

printMessage("aaa")

可选链使用介绍

可选链事实上并不是TypeScript独有的特性,它是ES11( ES2020)中增加的特性

可选链使用可选链操作符 ?.;

它的作用是当对象的属性不存在时,会短路表达式后面就不会执行,直接返回undefined,如果存在,那么才会继续执行;

虽然可选链操作是ECMAScript提出的特性,但是和TypeScript一起使用更版本;

例如我们定义如下一个对象

type Person = {
  name: string
  friend?: {
    name: string
    age?: number
  }
}

const info: Person = {
  name: "chenyq"
}

当我们在其他地方获取对象的属性时, 意味着name属性是一定可以获取到的, 而friend属性有可能是获取不到的

console.log(info.name)
// 表示friend有值的情况下再取name或者age, 没有值就是undefined, 代码不会报错
console.log(info.friend?.name)
console.log(info.friend?.age)

两个特殊操作符

有时候我们还会看到 !! 和 ?? 操作符,这些都是做什么的呢?

!! 和 ?? 操作符, 这本身也是JavaScript的特性, 并不是TypeScript的语法

!!操作符

将一个其他类型转换成boolean类型;

类似于Boolean(变量)的方式;

例如我们想要将message转为boolean类型再赋值给flag, 我们有两种方式

const message = "Hello World"

// 方式一: 通过Boolean(变量)的方式
let flag1 = Boolean(message)
console.log(flag1) // true

// 方式二: 通过 !! 操作符
let flag2 = !!message
console.log(flag2)

??操作符

它是ES11增加的新特性;

空值合并操作符( ??)是一个逻辑操作符,当操作符的左侧是 null 或者 undefined 时,返回其右侧操作数, 否则返回左侧操作数;

let message: string|null = null

// 当message没有值时, 将??操作符右边的默认值赋值给content
// 当message有值时, 将message的值赋值给content
const content = message ?? "我是默认值"
console.log(content) // 我是默认值

字面量类型介绍

除了前面我们所讲过的类型之外,也可以使用字面量类型( literal types):

字面量类型必须和它的值是保持一致的

// "Hello World"是可以作为类型的, 这个就叫字面量类型
let message: "Hello World" = "Hello World"
let num: 123 = 123

// 不能是其他的值
// message = "Hello"

那么这样做有什么意义呢?

默认情况下这么做是确实是没有意义的;

但是我们可以让多个字面量类型 结合 联合类型在一起, 就有了意义

// 例如我们用一个变量来保存对齐方式
let align: "left" | "right" | "center" = "left"

align = "right"
align = "center"

字面量推理介绍

我们来看下面的代码:

由于我们的对象再进行字面量推理的时候,options其实是一个 {url: string, method: string},而request的methods是字面量类型Method, 所以我们没办法将 一个 string 类型的值赋值给一个字面量类型, 因此编译阶段就会报错。

方式一: 当我们确定options对象的method没有写错的话, 我们可以使用类型断言(将宽泛的类型转为具体的类型), 如下:

// 使用类型断言
request(options.url, options.methods as Method)

方式二: 看起来有点奇怪, 但是是官方文档中提到的, 给对象添加as const

const options = {
  url: "http://aaa.org",
  methods: "POST"
} as const

总结

到此这篇关于TypeScript语法详解之类型操作补充的文章就介绍到这了,更多相关TypeScript类型操作的补充内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 分享Typescript的13个基础语法

    目录 一.Ts是什么 二. 基本语法 1.声明原始数据类型 2.声明Object类型 2.1声明数组类型 2.2声明元组类型 3.声明枚举类型 4.函数参数与返回类型 5.任意类型 6.类型断言 7.接口基本使用 8.类基本使用 9.类的访问修饰符 10.类只读属性 11.类与接口 12.抽象类 13.泛型 一.Ts是什么 首先,强类型不允许随意的隐式类型转换,而弱类型是允许的.JavaScript就是经典的弱类型语言.而Typescript可以说是JavaScript的超集,在JS的基础上新增

  • TypeScript声明文件的语法与场景详解

    目录 简介 语法 内容 模块化 模块语法 三斜线指令 reference amd-module 场景 1. 在内部项目中给内部项目写声明文件 2. 给第三方包写声明文件 全局变量的第三方库 修改全局变量的模块的第三方库的声明 修改window ESM和CommonJS UMD 模块插件 总结 简介 声明文件是以.d.ts为后缀的文件,开发者在声明文件中编写类型声明,TypeScript根据声明文件的内容进行类型检查.(注意同目录下最好不要有同名的.ts文件和.d.ts,例如lib.ts和lib.

  • 关于TypeScript应该尽量避免的语法总结

    目录 前言 避免枚举 避免名字空间 避免装饰器(对于现在而言) 避免 Private 关键字 总结 前言 这个文章列举了我们建议尽量避免的 TypeScript 语法.但是因为你的项目的情况,有可能使用这些特性也是合理的,但是我们仍然建议,在默认情况下,尽量避免使用这些特性. 随着时间的发展,TypeScript 已经是一门复杂的语言.在早期的时候,TypeScript 研发团队增加了一些不兼容 JavaScript 的语法.但是随着发展,新的版本已经不会这么做了,会非常保守地和严格地遵循 Ja

  • TypeScript语法详解之类型操作的补充

    目录 类型操作的补充 类型断言的使用 非空类型的断言 可选链使用介绍 两个特殊操作符 字面量类型介绍 字面量推理介绍 总结 类型操作的补充 类型断言的使用 有时候TypeScript无法获取具体的类型信息,这个我们需要使用类型断言( Type Assertions). 比如我们在操作DOM的时候, 通过 document.getElementById 获取元素, TypeScript只知道该函数会返回HTMLElement ,但并不知道它具体的类型, 是无法得知具体是img还是div等等: 当我

  • Android Kotlin开发实例(Hello World!)及语法详解

    Android Kotlin开发实例及语法详解 前言 Kotlin是一种在 Java虚拟机上执行的静态型别编程语言,它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言.该语言有几个优势 1. 简洁 它大大减少你需要写的样板代码的数量. 2. 安全 避免空指针异常等整个类的错误. 3. 通用 构建服务器端程序.Android 应用程序或者在浏览器中运行的前端程序. 4. 互操作性 通过 100% Java 互操作性,利用 JVM 既有框架和库. 配置 在我们的AndroidS

  • C语言ASM汇编内嵌语法详解

    3 GCC Inline ASM GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写简洁高效的代码. 1.基本内联汇编 GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子: __asm__("movl %esp,%eax"); // 看起来很熟悉吧! 或者是 __asm__(&q

  • vue框架中props的typescript用法详解

    什么是typescript typescript 为 javaScript的超集,这意味着它支持所有都JavaScript都语法.它很像JavaScript都强类型版本,除此之外,它还有一些扩展的语法,如interface/module等. typescript 在编译期会去掉类型和特有语法,生成纯粹的JavaScript. Typescript 5年内的热度随时间变化的趋势,整体呈现一个上升的趋势.也说明ts越来越️受大家的关注了. 在vue中使用typescript时,需要引入vue-pro

  • C++语法详解之封装、构造函数、析构函数

    大家先了解下什么是构造函数,什么是析构函数,作用是什么? 构造函数(方法)是对象创建完成后第一个被对象自动调用的方法.它存在于每个声明的类中,是一个特殊的成员方法.作用是执行一些初始化的任务.Php中使用__construct()声明构造方法,并且只能声明一个. 析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法.是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等. 下面在通过具体例子看下C++语法详解之封装.构

  • 详解python3类型注释annotations实用案例

    1.类型注解简介 Python是一种动态类型化的语言,不会强制使用类型提示,但为了更明确形参类型,自python3.5开始,PEP484为python引入了类型注解(type hints) 示例如下: 2.常见的数据类型 int,long,float: 整型,长整形,浮点型 bool,str: 布尔型,字符串类型 List, Tuple, Dict, Set: 列表,元组,字典, 集合 Iterable,Iterator: 可迭代类型,迭代器类型 Generator:生成器类型 Sequence

  • Web应用开发TypeScript使用详解

    目录 一.什么是 TypeScript 二.TypeScript 简史 三.为什么我们要使用TypeScript? TypeScript的附加功能 四.大牛现身说法: 五.你可能不知道的TypeScript顶级功能 1.面向对象程序设计 2.接口.泛型.继承和方法访问修饰符 3.编译时/静态类型检查 4.比JavaScript代码更少 5.可读性 6.兼容性 7.提供可以将代码转换为JavaScript等效代码的“编译器” 8.支持模块 9.ES6 功能支持 10.在流行的框架中使用 11.减少

  • MySQL存储过程及语法详解

    目录 1. 存储过程基本用法 1.1 概念 1.2 创建存储过程 1.2.1 语法格式 2.2.2 语法介绍 1.3 调用存储过程 1.4 查看存储过程 1.5 删除存储过程 2. 存储过程中的语法结构 2.1 变量的声明以及赋值 2.1.1 DECLARE 声明变量 2.1.2 SET 变量赋值 2.1.3 select...into 赋值 2.2 条件判断 2.2.1 if条件判断 2.3 传递参数 2.3.1 IN - 输入参数 2.3.2 out - 输出参数 2.4 case 结构 2

  • Android 10 启动分析之init语法详解

    目录 正文 Actions Services Options Triggers Commands Imports 正文 init.rc脚本包含5种类型,Action(动作),Commands(命令), Services(服务),Options(选项), Imports(导入). 以上这些都是基于“行”来解析的,并且用空格隔开关键字. 如果关键字中有空格,处理方法类似于C语言,使用/表示转义,使用""防止关键字被断开,另外需要注意/在末尾表示换行. #开头表示注释. 可以使用语法 ${p

  • C语言自研定时器计划任务语法详解

    目录 为啥要自研 语法格式 执行计划 符号 模式 语法演示 基本操作 符号操作 模式操作 头文件 实现文件 为啥要自研 市面主流定时器计划任务语法: cron ,但是使用起来非常难受,设计的比较非人性话语法,我想一般人都没几个记住的,都是靠在线生成工具进行使用的,而且只能持续执行不是有限执行,下面举几个cron的案例: 具体想了解的可以自行百度,我试图记住语法,但是因为太混乱了,时间一长就忘了,没法只能到网上工具里生成,而且很多有限的场景没法生成因为cron不支持只执行几次或者有规律的执行,为了

随机推荐