TypeScript 如何进行断言,可以让后续不必写重复的断言?

作者站长头像
站长
· 阅读数 9

如下面的例子

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;
    }
  }

TypeScript 如何进行断言,可以让后续不必写重复的断言?这种情况又该怎么办呢?

回复
1个回答
avatar
test
2024-07-15

这个功能叫narrowing

function foo(e: Event) {
  if(e instanceof MouseEvent) {
    // todo
  } else if (e instanceof KeyboardEvent) {
    // todo
  }
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容