站点工具

用户工具


TS 中箭头函数不能作为 type predicate 吗?

代码示例:

interface Animal {name: string; }
interface Cat extends Animal { meow(); }
 
function isCat(a: Animal): a is Cat {
  return a.name === 'kitty';
}
 
console.log(isCat({name:'dog'}))

上面代码不会报错。但是如果把 function 改为箭头函数就会报错,点此运行

const isCat: (a: Animal)=> a is Cat = (a) => {
  return a.name === 'kitty';
}

报错信息为

Type '(a: Animal) => boolean' is not assignable to 
type '(a: Animal) => a is Cat'.
  Signature '(a: Animal): boolean' must be a type predicate.

根据 TypeScript issues 里面的某人的解释,这是故意设计成这样的,因为我们最好不要把某个返回 bool 的函数赋值给 type predicate,应该在声明的时候就写好,所以正确的写法是这样的:

const isCat = (a:Animal): a is Cat => {
  return a.name === 'kitty';
}

好吧,这个解释看起来合理。

饥人谷一直致力于培养有灵魂的编程者,打造专业有爱的国内前端技术圈子。如造梦师一般帮助近千名不甘寂寞的追梦人把编程梦变为现实,他们以饥人谷为起点,足迹遍布包括facebook、阿里巴巴、百度、网易、京东、今日头条、大众美团、饿了么、ofo在内的国内外大小企业。 了解培训课程:加微信 xiedaimala03,官网:https://jirengu.com

若愚 · 2023/02/09 10:53 · ts_中箭头函数不能作为_type_predicate_吗.txt