// 2.联合类型
// 联合类型,如果不进行初始化操作,必须要给类型,否则都是any
let numOrStr: string | number;
// 默认联合类型,在没有确定类型之前,只能调用两个类型共同的方法
// numOrStr.
// 在变量确定类型后 可以设置对应的方法
numOrStr = 'abc';
numOrStr = 123;
// 如果赋予类型后,可以根据上下文自动推断对应类型的方法
// 在取值的时候也会遇到联合类型
const ele: HTMLElement | null = document.getElementById('app');
// const ele: HTMLElement = document.getElementById('app')!;
// ! 非空断言,表示这个东西一定有值,ts特有,使用有一定风险,使用前提是确保一定不为空
ele!.innerHTML = 'abc';
// as / <> 直接强转某个类型,表示类型就是联合类型中的某一个,必须联合类型中有才行
let l: string | number | undefined
// (<number>l).toFixed();
// <boolean>a,// 会报错
// 将“string | number | undefined”类型转换为“boolean”类型可能是错误的,
// 因为两种类型都没有充分重叠。如果这是有意的,请先将表达式转换为“未知”。
// 类型“number”与类型“boolean”不可比较
// jsx 语法 <div class={}>,<boolean>l 和jsx 冲突 所以不建议使用
(l as any) as boolean; // 双重断言,先转化成any,在转换成一个具体的类型,问题是会导致类型出问题
// || && | & | ??
false ?? true // ??表示排除null和undefined,只??前面的值不是null或undefined,就将前面的值返回,否则取后面的
// 字面量类型
type IType = string | number | undefined; // 类型别名
let type: IType = true // 赋值只能是IType中的
let type2: IType = 'c'