#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[];