第八课:类型断言;

89 阅读1分钟

作用: 手动指定一个值的类型;

语法:value as type;

注意:类型断言只能够「欺骗」TypeScript 编译器,无法避免运行时的错误,反而滥用类型断言可能会导致运行时错误;

使用时机:当某个值可能不明确类型时,为其指定一个明确的类型,从而可以使用指定这个类型的方法和属性;

使用的几个场景:

  • 联合类型可以被断言为其中一个类型
interface a {
    name: string,
    run(): Function
}
interface b {
    name: string,
    say(): Function
}

function c(x: a | b) {
    x.name = 'name'; // 共有属性,不会报错
    
    // say仅b才有的属性,直接使用会报错,需要先断言为b才能正常使用;
    // 注意如果此时传入为a则会在运行时报错,欺骗了TS过了编译;
    (x as b).say();
}
  • 父类可以被断言为子类
interface father {
    name: string,
}
interface sun extends father{
    age: number
}

function a(x: father) {
    (x as sun).age = 10;
}
  • 任何类型都可以被断言为 any
// TS的意义为为每个值确定明确的类型,此方式可能会忽略一些类型的错误,非必需尽量少用;
// window 上 无 a的属性或者方法,直接只用会报错,此时可以使用断言为any类型;
(window as any).a = '1';
  • any 可以被断言为任何类型
// 防止衍生出更多的any类型;
function a(x: string): any {
    return false;
} 
interface b {
    name: string,
    run(): number,
}
const c = a('1') as b;
c.run();