首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候需要“is”谓词,而不是使用“in”操作符?

什么时候需要“is”谓词,而不是使用“in”操作符?
EN

Stack Overflow用户
提问于 2020-02-18 00:07:59
回答 1查看 50关注 0票数 2

根据TypeScript文档我们可以使用TypeGuards来区分类型。

文档给出了使用is谓词和使用in运算符的示例。

is 谓词:

代码语言:javascript
复制
function isFish(pet: Fish | Bird): pet is Fish {
    return (pet as Fish).swim !== undefined;
}

if (isFish(pet)) {
    pet.swim();
}
else {
    pet.fly();
}

in 算子:

代码语言:javascript
复制
function move(pet: Fish | Bird) {
    if ("swim" in pet) {
        return pet.swim();
    }
    return pet.fly();
}

in操作符看起来更简洁、更简单--尽管也许显式地将类型区分拉到函数中是有帮助的,而且从长远来看更容易维护。

是否有is谓词可以区分in运算符不能区分的类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-18 00:31:12

in运算符只是缩小变量类型的一种方法。您可以使用任何您喜欢的检查来编写类型保护:

代码语言:javascript
复制
type JSONPrimitive = number | string | boolean | null;

function isJsonPrimitive(x: any): x is JSONPrimitive {
    return x === null
        || typeof x === 'number'
        || typeof x === 'string'
        || typeof x === 'boolean';
}

或者:

代码语言:javascript
复制
interface TreeNode {
    value: number;
    left: TreeNode | null;
    right: TreeNode | null;
}
type InternalNode = TreeNode & ({ left: TreeNode } | { right: TreeNode });

function isInternalNode(node: TreeNode): node is InternalNode {
    return node.left !== null || node.right !== null;
}

这两个示例都不能使用in运算符进行等效重写。

也就是说,用户定义的类型保护类似于类型断言,因为类型记录不检查它们的正确性。因此,您可以在实现类型保护时使用任何您喜欢的逻辑;甚至允许无条件的return true;

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60272040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档