TypeScript 如何进行断言,可以让后续不必写重复的断言?
如下面的例子
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;
}
}
这种情况又该怎么办呢?
回复
1个回答

test
2024-07-15
这个功能叫narrowing
function foo(e: Event) {
if(e instanceof MouseEvent) {
// todo
} else if (e instanceof KeyboardEvent) {
// todo
}
}
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容