typescript中的type predicates怎么理解

function isFish(pet: Fish | Bird): pet is Fish {
    return (pet as Fish).swim !== undefined;
}

文档中有这么个例子,反复看了很多遍,这个pet is Fish是干啥的,具体有什么作用?为啥用了pet is Fish我们再函数内部还是要使用断言?

阅读 3.3k
1 个回答

细究到底还是Typescript不够聪明,还不能从一个函数调用中推断出类型的变化。

举个例子

function isFish(fishOrBird: Fish|Bird) {
  return fishOrBird.wings == null // 没有翅膀
}

const fishOrBird: Fish | Bird = foo  // 鱼或者鸟

if (isFish(fishOrBird)) {
  // 这里报错了,Typescript并不知道isFish函数里面做了什么,
  // 所以它还是保守(保守即安全)地认为fishOrBird的类型还是Fish | Bird
  fishOrBird.swim() 
}

所以Typescript给了开发者机会,让开发者了提示Typescript这是什么类型, 现在改进一下isFish函数:

function isFish(fishOrBird: Fish|Bird): fishOrBird is Fish { // 告诉Typescript:如果我返回true,那它就是鱼
  return fishOrBird.wings == null 
}

站在Typescript的角度想想就明白了