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

pkbketx9  于 2023-01-06  发布在  TypeScript
关注(0)|答案(5)|浏览(144)

关于用户定义类型保护的 typescript 手册将示例类型保护定义为

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

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

1qczuiv0

1qczuiv01#

TypeScript支持箭头函数类型保护(2017年可能没有)。下面的代码现在可以正常工作了。我在生产代码中经常使用这种风格:

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

omqzjyyz2#

使用类型Assert而不是类型声明:

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

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

hmmo2u0o

hmmo2u0o3#

是的,就像返回boolean一样,只需返回pet is Fish

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

Arrow函数被声明为单一类型((pet: Fish | Bird) => pet is Fish),而不是分别声明参数和返回类型。

0x6upsns

0x6upsns4#

作为替代方案,这也可以

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');
rfbsl7qr

rfbsl7qr5#

这对我很有效:

const importList = children.filter(
  (node): node is MeshFullType<Mesh.Import> =>
    code.isMeshFullType(node, Mesh.Import),
)

相关问题