ts 内置类型与类型断言
// 变量 函数不显式声明类型 会被推导为any
// unknow和any 区别 any是代表自己可以是任何类型 unknown代表目前未确定是什么类型 但是将来会有一个确定类型
//一个 unknown 类型的变量可以再次赋值为任意其它类型,但只能赋值给 any 与 unknown 类型的变量let unknownVar: unknown;
let unknownVar: unknown;
// unknownVar.foo(); 报错:对象类型为 unknown
(unknownVar as { foo: () => {} }).foo(); // 类型断言就不会报错
// never类型不携带任何类型信息,是所有类型的子类型
// 它主要被类型检查所使用
function justThrow(): never {
throw new Error
}
// 类型断言 显式告知类型检查程序当前这个变量的类型
const str1: string = "lcq";
(str1 as any).func()
// 如果不使用断言直接用union 判断某一个分支就会报错
function foo(union: string | number) {
if ((union as string).includes("linbudu")) { }
if ((union as number).toFixed() === '599') { }
}
型断言的正确使用方式是,在 TypeScript 类型分析不正确或不符合预期时,将其断言为此处的正确类型
双重断言
//双重断言 ,原类型与断言类型之间差异过大 TypeScript 会给你一个类型报错
// 比如string 类型直接推断到对象
// 需要断言到 unknown 类型,再断言到预期类型
const str12: string = 'lcq';
(str as unknown as { handler: () => {} }).handler();
// 使用尖括号断言
(<{ handler: () => {} }>(<unknown>str12)).handler();
非空断言
// 非空断言
declare const foo12: {
func?: () => ({
prop?: number | null;
})
};
foo12.func!().prop!.toFixed()
// 可选链也能实现类似效果
foo12.func?.().prop?.toFixed();
//非空断言常见场景
const element = document.querySelector("#id")!;
const target = [1, 2, 3, 599].find(item => item === 599)!;
// 非空断言是类型断言的简写
((foo12.func as () => {
prop?: number;
})().prop as number).toFixed();
// 类型断言还有一种用法是作为代码提示的辅助工具
interface IStruct {
foo: string;
bar: {
barPropA: string;
barPropB: number;
barMethod: () => void;
baz: {
handler: () => Promise<void>;
};
};
}
// 实现一个对象 直接使用类型标注会报错 比如完整实现每个属性 方法
// const iStruct: IStruct = {};
// 使用类型断言可以不报错
const iStruct = <IStruct>{
bar: {
baz: {
handler: ()=>{}
},
},
}