ts概述、ts环境准备和编译、ts类型声明( 五 )


使用交叉类型来扩展属性:
// 假设 Slice 对象是通过npm安装的一个reduxjs中的类型type Slice = {name: string}// 通过交叉类型扩展属性type ExtSlice = Slice & {username: string}const userSlice: ExtSlice = {name: 'aa',username: 'admin'}// 小案例 , 假设有下面这样的场景 , 我们可以通过交叉类型实现属性的扩展import { Request, Response } from 'express'const express = require('express')const app = express()app.listen(9000)app.get('/api/users', (req: Request & { html: string }, res: Response) => {// html属性它是我们自定义提供 是开发者自己创建的req.html = 'abc'res.send('aaa')})
3.15 类型断言
**断言:**断定某一个类型或值 。有些情况下 , 变量的类型对于我们来说是很明确 , 但是TS编译器却并不清楚 , 此时 , 可以通过类型断言来告诉编译器变量的类型 。
语法:[值 as 类型] 或 [值]
类型断言:
假设现在有一个 arg 变量 , 它既可能是类型也可能是类型 , 当我们访问它的属性时 , 就会报错 , 原因是 , arg 如果为类型的话 , 就没有属性 。想要解决这一问题 , 我们有两种方法:
类型保护
function fn(arg: number | string) {// string类型上面是有length属性 , 但是number它没有 , 所以你直接用 , 它就会报错 , number也是有可能的// 类型保护if (typeof arg === 'string') return arg.lengthreturn arg}
断言
function fn(arg: number | string) {// string类型上面是有length属性 , 但是number它没有 , 所以你直接用 , 它就会报错 , number也是有可能的// 断言它现在一定是一个string类型的变量// return (arg).lengthreturn (arg as string).length}
值断言:
值断言指用符号!:表示当前变量一定会有值 , 不会为空 。
class Person {// 属性暂时可能没有赋值 , 但是后续我一定会赋值给它 , 所以可以用一个断言非空name!: string// 也可以在构造函数中赋值// constructor(name: string) {//this.name = name// }}
链判断符:
判断?.左侧对象是否为 null 或 , 如果是就返回。
res?.data相当于:res == null ?: res.data