目录摘要
有时TypeScript很难获取具体的类型信息,所以我们需要使用类型断言(TypeAssertions)。
比如我们操作DOM的时候,是通过document.getElementById来获取元素的。 TypeScript 只知道该函数将返回 htmlElement,但不知道其具体类型。 很难知道具体编程酒店是img还是div等:
当我们添加类型断言后,TypeScript 就可以知道具体的类型信息
const el = document.getElementById("app") as HTMLImageElement el.src = "图片地址"
TypeScript 只允许类型断言转换为更具体或不太具体(指任何和未知)的类型版本。 该规则可以防止不可能的强制:
如果直接如下转的话会报错
我们可以先将message转换为any或unknowntypescript新特性,然后再转换为number,不推荐这样做
const message = "Hello World" const num: number = (message as a编程客栈ny) as number
非空类型的断言
当我们编译如下代码时typescript新特性,执行ts的编译阶段会报错:
这是因为传入的消息可能是未定义的,此时无法执行;
// 参数为可选类型的时候 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。 如果存在,则python可以继续执行;
事实上,可选链操作是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(变量)的形式;
例如,如果我们想将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 Worpythonld"
let num: 123 = 123
// 不能是其他的值
// message = "Hello"
这样做有什么意义呢?
默认情况下这样做确实没有意义;
我们可以将多个文字类型与联合类型组合起来,这是有道理的
// 例如我们用一个变量来保存对齐方式 let align: "left" | "right" | "center" = "left" align = "right" align = "center"
文字推理简介
我们看下面的代码:
因为当我们的对象进行字面推断时,虽然options是一个{url:string,method:string},而且请求的方法都是字面类型的Method,所以我们没有办法把一个string类型的值参数给A字面类型,所以在编译阶段就会报错。
形式1:当我们确定options对象的方法正确时,我们可以使用类型断言(将通用类型转换为特定类型),如下:
// 使用类型断言 request(options.url, options.methods as Method)
方法二:看起来有点奇怪,官方文档里有提到,在对象中添加asconst
const options = { url: "http://aaa.org", methods: "POST" } as const
总结
关于TypeScript句型解释的补充类型操作的这篇文章到此结束。 更多关于TypeScript类型操作的补充内容,请搜索我们之前的文章或者继续浏览下面的相关文章。 希望大家今后多多支持我们!
本文标题:TypeScript句子解释的类型操作补充
发表评论