Тип Typescript ‘строка | сообщение | (строка[] | Сообщение[])[]’ не может быть присвоен типу ‘строка[] | Сообщение[]’

#angular #typescript

#angular #typescript

Вопрос:

У меня проблема с переменной нескольких типов, InputMessage объявление:

 export type InputMessage = Message | string | Message[] | string[];
  

и я использую его следующим образом:

   private addMessage(msg: InputMessage, type: 'ERROR' | 'WARN' | 'INFO' | 'SUCCESS') {
    if (!msg) return;

    const arrayMsg: Message[] | string[] = msg instanceof Array ? msg : [msg];

    arrayMsg.forEach((item) => {
      this.message(item, type);
    })
  }
  

Но у меня ошибка при компиляции:

 ERROR in src/app/components/growl/growl.service.ts(52,11): error TS2322: Type '(string | Message)[]' is not assignable to type 'string[] | Message[]'.
      Type '(string | Message)[]' is not assignable to type 'string[]'.
        Type 'string | Message' is not assignable to type 'string'.
          Type 'Message' is not assignable to type 'string'.
  

Можете ли вы мне помочь, где я делаю ошибку.

Спасибо.

Ответ №1:

Проблема в том, что if msg не является массивом, тип msg выводится как string | Message . Помещение этого в массив делает этот массив неявным (string | Message)[] .

Один из способов предотвратить эту ошибку — выполнить проверку второго типа, чтобы позволить компилятору проверять string или Message :

 const arrayMsg: Message[] | string[] = msg instanceof Array ? msg : (typeof(msg) === 'string' ? [msg] : [msg]);
  

Другим способом сделать это было бы явное приведение типа [msg] :

 const arrayMsg2: Message[] | string[] = msg instanceof Array ? msg : [msg] as Message[] | string[];