如下面的例子
const getStrLength = (target: string | number): number => {
if (typeof target === "string") {
return target.length; // 这里的`target`被识别为`string`,不用写`(target as string)`
} else {
return target.toString().length;
}
};
那要是不能用typeof
进行识别的类型,如何写这个if
可以在后续内容中省略断言呢?
function getSomething(target: Event): number | string {
if (??? MouseEvnet ???) { // 这里怎么写可以省略下面的`(target as MouseEvent)`
console.log(target.clientX);
console.log(target.clientX);
console.log(target.clientX);
.... // 多行代码总不能每次都写`(target as MouseEvent)`吧
return target.clientX;
} else if (??? KeyboardEvent ???) {
return target.key;
} else {
...
}
}
有大佬回复用收窄 instanceof
可以解决,但是在自定义的类型并不能使用这个功能:
getStrLength(target: MyType1 | MyType2): number {
if (target instanceof MyType1) { // TS2693: 'ObjectType' only refers to a type, but is being used as a value here.
return target.a;
} else {
return target.length;
}
}
这种情况又该怎么办呢?
这个功能叫narrowing