类型断言可以用来手动指定一个值得类型
语法 :值 as 类型 或者<类型>值
在tsx中必须使用 前者
类型断言用途
讲一个联合类型断言为其中一个类型
interface Cat {
name: string;
run(): void;
}
interface Fish {
name: string;
swim(): void;
}
function isFish(animal: Cat | Fish) {
//这里讲animal 断言成Fish对象 强制类型转换,运行报错
if (typeof (animal as Fish).swim === 'function') {
return true;
}
return false;
}
注意:类型断言只是欺骗编译器,让编译器可以编译通过,但是如果强制类型转换,在执行的过程中回报错
将父类断言成子类
当一个类存在继承关系的时候,父类可以断言成更加具体的子类
class ApiError extends Error {
code: number = 0;
}
class HttpError extends Error {
statusCode: number = 200;
}
function isApiError(error: Error) {
if (typeof (error as ApiError).code === 'number') {
return true;
}
return false;
}
注意:当类型是一个接口的时候不能使用typeof 来判断类型。因为类型不是一个真正的值,在编译结果中是会被删除的。如果类型为一个接口的时候,可以使用类型的是否存在某个属性来判断它的类型来判断是什么类型
interface ApiError extends Error {
code: number;
}
interface HttpError extends Error {
statusCode: number;
}
function isApiError(error: Error) {
if (typeof (error as ApiError).code === 'number') {
return true;
}
return false;
}
可以将任意类型的断言成any类型
总结:
1 联合类型可以被断言成其中一个类型
2 父类可以断言成子类
3 任何类型可以断言成any
4 any 可以断言成任何类型
自我领悟:
函数的参数为接口类型的时候,有点特殊情况,函数的参数支持协变。协变不用关注对象的类型,只需要关心对象的参数。比如下面例子
interface a {
a:number,
c:number
}
interface b {
a:number
}
function fnc (params1:a):void{
console.log(params1.a)
}
let A:a = {
a:10,
c:20
}
let B:b = {
a:10
}
fnc(B as a);
但是对于赋值来说,上面情况不满足
网友评论