Typescript - Как решить «Тип« undefined »не может быть назначен типу« XXXX »»?

У меня есть интерфейс, определенный с некоторыми свойствами. При попытке получить доступ к службе я получаю эту ошибку: тип «неопределенный» не может быть назначен в файле отображения в this.isOpen. Мне нужна помощь, чтобы решить эту ошибку.

Примечание. Я не могу установить значения в файле конфигурации, такие как "strictNullChecks":false

Интерфейс

export interface DataFile {
  file?: DataFile[];
  location: string;
}

Класс машинописного текста


  isOpen?: DataFile;

  Scan(aero: string, TeamClass: string) {
    if (TeamClass === 'Hawkins') {
      if (this.redService.name.file && this.redService.name.file.length > 0) {
        this.isOpen = this.redService.name.file.filter((data: DataFile) => data.location == aero[0])[0];
      }
    }
    
    this.displayfile(this.isOpen).then(async () => {  ----->>>>>> Error at this.isOpen
            //rest of the functionality
        }
      }
    });
  }

Я получаю ошибку-

 Argument of type 'DataFile | undefined' is not assignable to parameter of type
'DataFile'.
  Type 'undefined' is not assignable to type 'DataFile'.

Настоящий вопрос здесь заключается в том, что вы хотите сделать, если this.isOpen это undefined? Прямо сейчас вы передаете его this.displayfile, но this.displayfile не допускает аргумент undefined.

Nick 19.12.2020 04:11

В качестве альтернативы, если this.isOpen никогда не бывает неопределенным, вам нужно исправить его ввод на isOpen: DataFile;

Nick 19.12.2020 04:12

Если я ставлю isOpen: DataFile;, то получаю эту ошибку Property 'isOpen' has no initializer and is not definitely assigned in the constructor.ts(2564)

Paritosh M 19.12.2020 04:13
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
3
1 490
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Установив isOpen со знаком вопроса, он выбирает два типа: DataFile (ваш тип) и undefined. Это основная причина, по которой Typescript сообщает об ошибке.

Чтобы решить эту проблему, у вас есть два варианта:

  • Проверьте, заполняется ли isOpen данными, т.е.:
if (!isOpen) { /* do something */ }
...rest of code
  • Перед isOpen добавьте ! (т. е. this.isOpen!), чтобы тип не был неопределенным. Не рекомендуется, потому что, если он действительно не определен, вы столкнетесь с ошибками внутри вашей функции this.displayfile.

Ссылка на оператор вопросительного знака здесь: https://www.geeksforgeeks.org/why-use-question-mark-in-typescript-variable/

Вы имеете в виду что-то вроде if (!isOpen) {this.displayfile(this.isOpen).then(async () => { - //rest of the functionality}}}); }, обернуть !isOpenусловие вокруг файла отображения?

Paritosh M 19.12.2020 04:29

Скорее, if (!isOpen) // don't continue with the functionality. Контекст восклицательного знака здесь является оператором НЕ.

jayg_code 19.12.2020 04:32

Итак, в моем случае я хочу if (isOpen) {this.displayfile(this.isOpen).then(async () => { - //rest of the functionality}}}); } Верно?

Paritosh M 19.12.2020 04:38

Это другой способ, да. Шаблон, который я рекомендую, является скорее защитным предложением, то есть мы сначала проверяем, существует ли он. Learningactors.com/…

jayg_code 19.12.2020 04:44

Другие вопросы по теме