Typescript错误,因为类型没有重叠,所以此条件将始终返回“ true”

时间:2018-12-11 07:59:37

标签: javascript angular typescript typescript2.0

我在表单组上有此条件:

if((age>17 && (this.frType=="Infant")) 
|| (age>40 && this.frType=="Grandchild")
|| (age<=5 && 
   (this.frType!="Child" 
   || this.frType!="Infant" 
   || this.frType!="Grandchild" || this.frType!="Cousin")))

它包含3个主要条件:

  1. 如果17岁的人无法设置为infant
  2. 如果一个人大于40岁,那么他就不能成为grandchild
  3. 如果一个人的年龄小于5岁,则应为childinfantgrandchildcousin

如果满足以下条件之一,我将发送一条错误消息。

我收到的错误是:

  

[ts]由于类型不同,此条件将始终返回“ true”   '“ Child”'和'“ Infant”'没有重叠。 [2367]

if条件的这一部分`:

|| this.frType!="Infant" || this.frType!="Grandchild" || this.frType!="Cousin")))

我在其他组件中使用的是确切条件,并且没有显示错误。

if((age>17 && (this.family_relation_type=="Infant")) 
|| (age>40 && this.family_relation_type=="Grandchild")
|| (age<=5 && 
   (this.family_relation_type!="Child" || 
    this.family_relation_type!="Infant" || 
    this.family_relation_type!="Grandchild" || 
    this.family_relation_type!="Cousin")))

这是我计算这两个部分的年龄的方法:

let timeDiff = Math.abs(Date.now() - this.formGroup.controls['dob'].value);
let age = Math.floor((timeDiff / (1000 * 3600 * 24))/365);

4 个答案:

答案 0 :(得分:2)

考虑独立表达式:

(this.frType!="Child" || this.frType!="Infant")

如果frTypeChild,则第二部分为true,因此表达式的计算结果为true。如果frTypeInfant,则第一部分为true,因此表达式的计算结果为true。如果frType既不是 Child也不是Infant,那么第一部分将为true,并且该表达式将再次赋值为true-逻辑有误,它将始终解析为true

(如果您为||Grandchild添加了额外的Cousin条件,同一件事不断发生-它将始终解析为true

请改用&&

|| (age<=5 && (
   this.frType!="Child" 
   && this.frType!="Infant" 
   && this.frType!="Grandchild"
   && this.frType!="Cousin"
 ))

或者,为使逻辑更容易理解,您可以考虑使用数组,并使用.includes

const kidsFiveAndUnder = ['Child', 'Infant', 'Grandchild', 'Cousin'];
// ...
|| (age <= 5 && !kidsFiveAndUnder.includes(this.frType))

答案 1 :(得分:2)

也许我可以帮助某人。

就我而言,错误是由以下原因触发的:

*ngIf="fooArray.length === 0"

所以我将其修改为:

*ngIf="fooArray.length < 1"

对我毫无意义,但它可以工作。

答案 2 :(得分:1)

就我而言,我只需要重建我的应用程序,因为类型定义暂时不同步。

答案 3 :(得分:0)

明确定义所有变量的数据类型。

例如,此代码具有与线程标题中提到的错误相同的错误,我通过显式定义变量的数据类型进行修复。

发件人:

const selectedLangCulture = "en"; // or "ar-SA"
const direction = "rtl";
const languageChanged =
  (direction === "rtl" && selectedLangCulture === "en") ||
  (direction === "ltr" && selectedLangCulture === "ar-SA");

收件人:

const selectedLangCulture: string = "en"; // Put the datatype string.
const direction: string = "rtl"; // Put the datatype string.
const languageChanged =
  (direction === "rtl" && selectedLangCulture === "en") ||
  (direction === "ltr" && selectedLangCulture === "ar-SA");