4.1、类型断言语法(用来手动指定一个值的类型):
语法1、值 as 类型
语法2、<类型>值:这种形式不能在 tsx 中使用,并且<>的语法也运用在“泛型”中,所有一般采用第一种语法。
4.2、 将一个联合类型断言为其中一个类型
联合类型提到过,当 TS 不确定一个联合类型的变量到底是哪个类型的时候,只能访问此联合类型的所有类型中共有的属性或方法。但是在有的时候,我们确实需要在还不确定类型的时候就访问其中一个类型特有的属性或方法,就需要断言:
interface Cat {
name: string;
run(): void
}
interface Fish {
name: string,
swim(): void
}
function isFish(animal: Cat | Fish){
if(typeof(animal as Fish).swim === 'function'){
return true
}
return false
}
注意:类型断言只能够「欺骗」TS 编译器,无法避免运行时的错误,反而滥用类型断言可能会导
致运行时错误。
4.3、将一个父类断言为更加具体的子类(具体语法请点击标题了解)
TS 的接口是一个类型,不是一个真正的值,它在编译结果中会被删除,当然就无法使用 instanceof 来做运行时判断。
4.4、将任何一个类型断言为 any
有的时候,我们非常确定这段代码不会出错:
window.foo = 1;
但编译器还是提示我们 window 上不存在 foo 属性;这时候就需要断言
(window as any).foo = 1;
它极有可能掩盖了真正的类型错误,所以如果不是非常确定,就不要使用 as any
4.5 将 any 断言为一个具体的类型
遇到 any 类型的变量时,如果选择无视它,就会任由它滋生更多的 any。选择改进它,通过类型断言及时的把 any 断言为精确的类型,使代码向着高可维护性的目标发展。
// 历史遗留代码返回值为 any
function getCancheDate(key: string): any{
return (window as any).cache[key]
}
interface Cat{
name: string;
run(): void
}
const tom = getCancheDate('tom') as Cat;
tom.run()
4.6、类型断言的限制
-
联合类型可以被断言为其中一个类型
-
父类可以被断言为子类
-
任何类型都可以被断言为 any
-
any 可以被断言为任何类型
-
要使得 A 能够被断言为 B,只需要 A 兼容 B 或 B 兼容 A 即可
其实前四种情况都是最后一个的特例。
4.7、双重断言
4.8 类型断言 vs 类型转换
4.9 类型断言 vs 类型声明
4.10 类型断言 vs 泛型:类型断言 · TypeScript 入门教程