一个变量类型允许是多个类型,如果访问某个类型的属性,编辑器会直接提示错误
比如 变量 tuple 可能为string 或 number 类型,如果直接访问tuple.toFixed
const mixedTupleTypeArray: (string|number)[] = ['hello', 2333]
const tuple = mixedTupleTypeArray[0];
// tuple 类型有可能是 string 或 number
// 编辑器会提示错误,Property 'toFixed' does not exist on type 'string | number'
if(tuple.toFixed){
}
即使加?操作符也不行,还是会提示错误
tuple?.toFixed
解决方法: typeof 判断类型后再访问,如下所示
if(typeof tuple === 'number'){
tuple.toFixed
}
if(typeof tuple === 'string'){
tuple.substring
}
如果是 class 类相关的继承模式呢?
比如
class Animal{
}
class Dog extends Animal{
constructor(){
super();
}
speak(){
console.log('汪')
}
}
const animal = new Animal();
const dog = new Dog();
const mixedClassTypeArray: (Animal|Dog)[] = [animal, dog];
const classItem = mixedClassTypeArray[0]
// 报错 Property 'speak' does not exist on type 'Animal | Dog'.
if(classItem.speak){
}
直接使用 classItem.speak 编辑器提示错误 Property 'speak' does not exist on type 'Animal | Dog'
两种写法可以解决
方法一
用 as 强行告诉编译器,classItem 属于 Dog 类
if((classItem as Dog)?.speak){
}
方法二
用 instanceof 判断实例化自哪里
if(classItem instanceof Dog){
classItem.speak
}
转载入注明博客园池中物 willian12345@126.com sheldon.wang
github: https://github.com/willian12345