代码之家  ›  专栏  ›  技术社区  ›  LudvigH

箭头样式用户定义的类型保护?

  •  14
  • LudvigH  · 技术社区  · 7 年前

    这个 typescript handbook on user defined type guards 将示例类型guard定义为

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

    箭头函数是否有相应的语法?

    4 回复  |  直到 7 年前
        1
  •  18
  •   James Dunne    4 年前

    TypeScript支持箭头函数类型guards(2017年可能没有)。现在,以下各项按预期工作。我在生产代码中经常使用这种样式:

    const isFish = (pet: Fish | Bird): pet is Fish => 
      (pet as Fish).swim !== undefined;
    
        2
  •  5
  •   unional    3 年前

    使用类型断言而不是类型声明:

    const isFish = (pet => !!pet.swim) as (pet) => pet is Fish 
    

    然而,考虑到它更为冗长,我更愿意将类型保护作为普通函数编写,除非您确实需要 this 绑定,但这可能是代码的味道。

        3
  •  3
  •   Madara's Ghost    7 年前

    是的,就像你回来时一样 boolean ,您只需返回 pet is Fish :

    const isFish: (pet: Fish | Bird) => pet is Fish = pet => (pet as Fish).swim !== undefined
    

    箭头函数声明为单一类型( (pet: Fish | Bird) => pet is Fish )而不是将参数和返回类型分开。

        4
  •  1
  •   Dan Dohotaru    6 年前

    作为一种替代方案,这也可行

    const isFish = (pet: any): pet is Fish => !!pet.swim;
    

    或者如果你想更明确一点

    const isFish = (pet: any): pet is Fish => pet.swim === 'function';
    

    而测试也可以针对属性进行

    const isFish = (pet: any): pet is Fish => pet.hasOwnProperty('genus');