Angular 为什么我应该使用谓词作为返回类型而不是布尔类型?
在阅读本文时,我刚刚了解了用户定义的typeguards: 在本文的一个示例中,他们使用Angular 为什么我应该使用谓词作为返回类型而不是布尔类型?,angular,typescript,Angular,Typescript,在阅读本文时,我刚刚了解了用户定义的typeguards: 在本文的一个示例中,他们使用petisfish作为方法返回类型,该返回类型是谓词 我发现与其使用这种返回类型,不如使用boolean。那么,参数is Typereturntype只是语法上的糖类,还是有特定用途 如果返回一个布尔值函数,则该函数将是一个简单函数,而不是typeguard。pet is Fish语法向编译器发出信号,表明此函数将影响参数的类型 例如: class Fish { f: boolean } class Dog
petisfish
作为方法返回类型,该返回类型是谓词
我发现与其使用这种返回类型,不如使用
boolean
。那么,参数is Type
returntype只是语法上的糖类,还是有特定用途 如果返回一个布尔值
函数,则该函数将是一个简单函数,而不是typeguard。pet is Fish
语法向编译器发出信号,表明此函数将影响参数的类型
例如:
class Fish { f: boolean }
class Dog { d: boolean; }
declare let x: Fish | Dog;
declare function isFish(p: Fish | Dog): boolean
declare function isFishGuard(p: Fish | Dog): p is Fish;
if (isFishGuard(x)) {
x.f // x is Fish
}
if (isFish(x)) {
x.f // error x is still Fish|Dog
}
链接中说明了具体用途。如果您对未知类型的变量进行了类型检查,并且它的计算结果为真,那么typescript知道该变量是鱼,您可以安全地将其视为鱼。为什么第二个
If
会根据您的判断给出错误?我注意到,当您将变量声明为type1 | type2
时,该变量将同时获得type1和type2的属性,这意味着在通过typeguard确定实际类型后,无需将变量强制转换为这两种类型中的任何一种。因此,在您的示例中,如果x的实际类型不是fish,那么第二个if中的x.f
将只返回值undefined
。@Mauricetype1 | type2
是联合类型,这意味着它可以是type1
或type2
。Typescript只允许您访问此类类型的公共属性(在本例中没有公共属性)<代码>类型1和类型2是一种交叉类型,允许访问这两种类型的属性。类型保护旨在将联合类型(在本例中为Fish | Dog
)缩小为更具体的类型(在本例中为isFishGuard
将x
的类型缩小为Fish
)请查看我在编辑:
下发布的代码片段。这运行时没有错误。AdvancedFilter和HTMLInputElement都没有名为value
的属性,只有HTMLInputElement具有此属性,然而,在else
部分中,我仍然可以调用filter.value
,而不必先将filter
转换为HTMLInputElement
。@Maurice如果没有的定义,它就是高级过滤器
和高级过滤器
很难判断发生了什么。你可以在操场上试试我的样品,你会在第二次进入时出错。我会在答案中添加一个游乐场链接。不过,我已经从帖子中删除了编辑内容,因为你是对的。虽然类AdvancedFilter
没有声明值
成员,但该类确实继承了超类对象/any
的所有成员。该类碰巧有一个值
成员,这解释了为什么在未首先强制转换到HTMLInputElement
的情况下使用该成员时不会出现运行时错误。