由于类型没有重叠,此条件将始终返回‘TRUE’

bfhwhh0e  于 2022-09-18  发布在  Java
关注(0)|答案(6)|浏览(307)

我在表单组上有以下情况:

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
1.如果一个人大于40,他不可能是grandchild
1.未满5岁者,应为childinfantgrandchildcousin

如果这些条件之一为真,我将发送错误消息。

我收到的错误是:
[TS]此条件将始终返回‘True’,因为类型‘“Child”’和‘“Infant”’没有重叠。[2367][晓雨-0920交稿]

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);
btxsgosb

btxsgosb1#

考虑一下独立的表达式:

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

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

(如果您为GrandchildCousin添加额外的||条件,同样的事情会继续发生-它将始终解析为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))
tkqqtvp1

tkqqtvp12#

  • 也许我可以在这方面帮助某人*

在我的案例中,该错误是由以下因素触发的:

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

因此我将其修改为:

*ngIf="fooArray.length < 1"

对我来说没什么意义,但很管用。

zzzyeukh

zzzyeukh3#

显式定义所有变量的数据类型。

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

出发地:

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");
n3ipq98p

n3ipq98p4#

最近,我在这个问题上苦苦挣扎。在这里分享我的经验

基本上,IDE不允许将object.enum与字符串进行比较。作为解决方案,在Component.ts中添加一个方法来比较枚举

详细信息:

export enum Status {
     NEW,
     PROGRESS,
     FINISHED
}

export interface Model {
   id : number;
   name : string;
   status : Status
}

现在,在Component.html中,我尝试比较模型状态

<div *ngFor="let m of modelItems" >
      <i *ngIf="m.status === 'NEW'" class="icon-new"></i>
</div>

Error : This condition will always return 'false' since the types 'Status' and 'string' have no overlap.ngtsc(2367)

我还尝试在Component.ts中定义状态枚举,并将其用于比较

public StatusEnum = Status; 

<div *ngFor="let m of modelItems" >
      <i *ngIf="StatusEnum[m.status] === 'NEW'" 
        class="icon-new"></i>
</div>

使用上面的解决方案,不会出现IDE错误,但条件永远不为真,因为enum[Value]给出了一个数值。

我尝试的下一个选项如下

<div *ngFor="let m of modelItems" >
      <i *ngIf="m.status=== StatusEnum[StatusEnum.NEW]" class="icon-new"></i>
    </div>

但最终在IDE中再次出现错误

Error : This condition will always return 'false' since the types 'Status' and 'string' have no overlap.ngtsc(2367)

最后是什么解决了这个问题?它在组件中实现了一个方法。

解决方案

Component.ts

public StatusEnum = Status; //To refer in the HTML

 checkStatus(m: Model, status: Status): boolean {
    return Status[m.status] as unknown === status;
  }

注:状态[m.status]为未知

超文本标记语言

<div *ngFor="let m of modelItems" >
       <i *ngIf="checkStatus(m,StatusEnum.NEW)" 
       class="icon-new"></i>
  </div>
s5a0g9ez

s5a0g9ez5#

在我的例子中,我只需要重新构建我的应用程序,因为类型定义短暂地不同步。

wyyhbhjk

wyyhbhjk6#

在我的例子中,我使用了名为type的类型作为按钮元素的React.ComponentPropsWithRef<'button'>

type ButtonProps = {
  type?: 'submit' | 'button' | 'link'; // ❌
} & React.ComponentPropsWithRef<'button'>;

type被覆盖,因为React.ComponentPropsWithRef<'button'>中也有type。我用elementType替换了它,问题就解决了。

type ButtonProps = {
  elementType?: 'submit' | 'button' | 'link'; // ✅
} & React.ComponentPropsWithRef<'button'>;

相关问题