根据TypeScript文档我们可以使用TypeGuards来区分类型。
文档给出了使用is谓词和使用in运算符的示例。
is 谓词:
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
if (isFish(pet)) {
pet.swim();
}
else {
pet.fly();
}in 算子:
function move(pet: Fish | Bird) {
if ("swim" in pet) {
return pet.swim();
}
return pet.fly();
}in操作符看起来更简洁、更简单--尽管也许显式地将类型区分拉到函数中是有帮助的,而且从长远来看更容易维护。
是否有is谓词可以区分in运算符不能区分的类型?
发布于 2020-02-18 00:31:12
in运算符只是缩小变量类型的一种方法。您可以使用任何您喜欢的检查来编写类型保护:
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';
}或者:
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;。
https://stackoverflow.com/questions/60272040
复制相似问题