Ошибка машинописного текста. Это условие всегда будет возвращать значение "истина", поскольку типы не перекрываются.

У меня было это условие в группе форм:

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 лет, он должен быть child, infant, grandchild или cousin.

Если одно из этих условий выполнено, я отправлю сообщение об ошибке.

Я получаю следующую ошибку:

[ts] Это условие всегда будет возвращать значение «истина», поскольку типы «Ребенок» и «Младенец» не перекрываются. [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);

person alim1990    schedule 11.12.2018    source источник
comment
происходит при неявном сравнении значений. Используйте === и! == вместо == &! =.   -  person Sunny Sharma    schedule 08.06.2021


Ответы (4)


Рассмотрим автономное выражение:

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

Если frType равно Child, вторая часть будет истинной, поэтому выражение будет оцениваться как true. Если frType равно Infant, тогда первая часть будет истинной, поэтому выражение будет оцениваться как true. Если frType не ни Child, ни Infant, тогда первая часть будет истинной, и выражение снова будет оцениваться как 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))
person CertainPerformance    schedule 11.12.2018
comment
Спасибо за откровенность ✌???? - person Adépòjù Olúwáségun; 26.10.2020

Может быть, я смогу помочь кому-нибудь с этим.

В моем случае ошибка была вызвана:

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

поэтому я изменил его так:

*ngIf="fooArray.length < 1"

Для меня это не имеет смысла, но это работает.

person alvarosmh    schedule 27.07.2020
comment
Лучше опустить материал Angular *ngIf, это просто шум, который не имеет отношения к рассматриваемой проблеме TypeScript. - person Andy; 23.10.2020
comment
Я знаю, что это не часть проблемы TS, я просто пытаюсь помочь кому-нибудь с таким же сценарием. - person alvarosmh; 06.05.2021

В моем случае мне просто пришлось перестроить приложение, потому что определения типов ненадолго рассинхронизировались.

person FrostyDog    schedule 08.12.2020

Явно определите типы данных всех ваших переменных.

Например, в этом коде есть та же ошибка, что упоминается в заголовке потока, и я исправил ее, явно указав типы данных переменных.

От:

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

To:

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");
person Mohammed Osman    schedule 10.11.2020