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 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容
