Не понимаю, почему это логическое сравнение терпит неудачу

#angular

#angular

Вопрос:

Довольно новичок в angular и не самый опытный разработчик javascript / typescript. В основном небольшие проекты.

В настоящее время понятия не имею, почему это сравнение завершается неудачей.

 if(data.success == true) {
      //do stuff
    }
  

где структура данных, которую я получаю, определяется как

 export class RegResponse {
  success : boolean;
  error : string;
  constructor(success: boolean, error: string){
    this.success = success;
    this.error = error;
  }
  

и
console.log данных.успех верен.

console.log(typeof(data.success)) является string (по какой-то причине)? но если я попытаюсь сравнить строку с переменной, которую она объявляет, выдает ошибку для операций, не применимых к логическим значениям.

Итак, я озадачен, почему это не работает.

Это как обходной путь работает, но я не понимаю, почему очевидное первое сравнение терпит неудачу.

 if(data.success   '' === 'true') {
  

Комментарии:

1. почему бы просто не написать if(data.success) ?

2. @Kepotx если data.sucess это строка "false” , то это истинное значение, и поток будет проходить внутри условия. Не делайте этого

Ответ №1:

Тот факт, что вы объявляете success как логическое значение, не означает, что ваш сервис вернет вам логическое значение. Если конечная точка возвращает строку, то это строка.

Typescript используется для определения типа, это просто способ сказать «Я ожидаю строку здесь и логическое значение там», но если источник неизвестен, тогда вам придется выполнить проверку самостоятельно.

При назначении data.success вы можете сделать что-то вроде этого:

 data.success = response.success === 'true';
  

В качестве дополнительного решения, если вы используете Angular 4 , вы можете реализовать безопасную систему проверки типов, просто указав интерфейс в Http-клиенте.

Вы можете прочитать больше в официальном руководстве:

 getReg() {
  // it will return an Observable of RegResponse
  return this.http.get<RegResponse>(this.configUrl);
}
  

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

Комментарии:

1. Я думаю, что я придерживаюсь мнения о том, что ввод текста строго соблюдается. Спасибо, это имеет смысл.

2. @jdprepaprop тот же код на строго типизированном языке программирования потерпел бы неудачу 🙂 это чистое несоответствие типов. Я советую вам использовать типизированный HttpClient , чтобы предотвратить эти проблемы в будущем

3. Условный оператор не нужен: data.success = response.success === 'true'; .

4. @ConnorsFan да, вы правы, это было просто для большей ясности, но я думаю, что обновлю свой ответ

Ответ №2:

если «data.success» имеет значение true, false, ‘true’ или ‘false’, вы можете попробовать: if(JSON.parse(data.success)) { //code }