联合类型
// 使用 | 来让一个数据支持多个类型
// 既可以是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