06.TS类型断言、联合类型、交叉类型

119 阅读2分钟
联合类型
// 使用 | 来让一个数据支持多个类型
// 既可以是number 又可以是 string
let phone: number | string = 18888888888
交叉类型

多种类型的集合,联合对象将具有所联合类型的所有成员

简单理解:就是把类型进行合并

// 交叉类型
interface Person {
  name: string
  age: number
}

interface Man {
  gender: string
}

// 相当于把2个interface结合起来了 传入的参数要满足 Person 还要满足 Man
// 首先是个人 然后是个男人
const Yang = (yang: Person & Man): void => {
  console.log(yang)
}

Yang({ name: 'Yang', age: 18, gender: '男' })

类型断言
const fn = (v: string | number) => {
  // 第一种写法 通过 as 进行类型断言 TS你就别管了 天王老子来了这里也是个string类型的v
  console.log((v as string).length)
  // 第二种写法
  console.log((<string>v).length)
}

fn('666666')

// 只能欺骗Ts进行编译 但是无法保证编译或执行过程出不出错 所以不能滥用类型断言
临时断言
// 此时不被允许 window上面没有 aaa
window.aaa = 123
// 临时断言成 any any类型的数据可以访问任何属性而不报错 不要滥用any哦
(window as any).aaa = 123
as const

是对字面值的断言,与const直接定义常量是有区别的

如果是普通类型跟直接const 声明是一样的

const name = 'Yang'
name = 'LvYang' //无法修改
let names = 'Yang' as const
names = 'LvYang' //无法修改
// 数组
let a1 = [10, 20] as const;
const a2 = [10, 20];
​
a1.unshift(30); // 错误,此时已经断言字面量为[10, 20],数据无法做任何修改
a2.unshift(30); // 通过,没有修改指针
类型断言是不具影响力的 只是欺骗ts编译器 实际上该如何执行还是如何执行

在下面的例子中,将 something 断言为 boolean 虽然可以通过编译,但是并没有什么用 并不会影响结果, 因为编译过程中会删除类型断言 属于自我欺骗

function toBoolean(something: any): boolean {
    return something as boolean;
}
 
toBoolean(1);
// 返回值为 1