У меня проблемы с основными типами профсоюзов, спасибо за помощь!
Создание приложения чата, в котором входящие сообщения могут иметь полезную нагрузку различного типа. Поэтому я создал несколько типов полезных данных, таких как:
export interface TextPayload {
text: string,
}
export interface ImagePayload {
url: string,
} //etc
связал их все в типе объединения, чтобы прояснить ситуацию, используя |
export type MessagePayload = TextPayload | ImagePayload | UrlPayload | FilePayload
и затем последнее Сообщение использует это как полезную нагрузку.
export interface IBotMsg {
payload: MessagePayload // this creates the problem
}
но при попытке использования я получаю эту ошибку
[0] TS2459: Type 'MessagePayload' has no property 'text' and no string index signature.
Код используется здесь. Возможно, его назначение разрушения сбивает с толку систему типов ...
const msg: IBotMsg = req.body.msg
const { payload: { text } } = msg
ещё одна ошибка в строке
let text = msgIn.payload.text
Полная ошибка
[0]
[0] ERROR in ./server/bots/watson/routes/index.ts
[0] [tsl] ERROR in /Users/dc/dev/tix/recobot/stack/backend/server/bots/watson/routes/index.ts(19,22)
[0] TS2459: Type 'MessagePayload' has no property 'text' and no string index signature.
[0]
[0] ERROR in ./server/bots/watson/routes/index.ts
[0] [tsl] ERROR in /Users/dc/dev/tix/recobot/stack/backend/server/bots/watson/routes/index.ts(40,25)
[0] TS2339: Property 'text' does not exist on type 'MessagePayload'.
[0] Property 'text' does not exist on type 'ImagePayload'.
[0]
[0] ERROR in ./server/bots/tix/brain/TixBrain.ts
[0] [tsl] ERROR in /Users/dc/dev/tix/recobot/stack/backend/server/bots/tix/brain/TixBrain.ts(27,30)
[0] TS2339: Property 'text' does not exist on type 'MessagePayload'.
[0] Property 'text' does not exist on type 'ImagePayload'.
[0]
[0] ERROR in /Users/dc/dev/tix/recobot/stack/backend/server/bots/testbot/TestBot.ts
[0] [tsl] ERROR in /Users/dc/dev/tix/recobot/stack/backend/server/bots/testbot/TestBot.ts(12,39)
[0] TS2339: Property 'text' does not exist on type 'MessagePayload'.
[0] Property 'text' does not exist on type 'ImagePayload'.
это почти как если бы компилятор только что на полпути на ImagePayload ...
Означает ли тип объединения, что свойства должны существовать в каждом члене, а не только в одном? Подтипы должны быть надмножеством интерфейса? Я не совсем вижу смысла в этом случае.
Я также попробовал только с TextPayload
, например, не тип объединения, и получил похожую ошибку ... запутался.
Я также немного запутался между типами и интерфейсами. Почему это не UnionInterface
?
Спасибо за любые советы.
MS ссылка
https://www.typescriptlang.org/docs/handbook/advanced-types.html
полный код
export enum MessageType {
TEXT = 0,
IMAGE = 1,
URL_LINK = 2,
FILE = 3,
}
export interface TextPayload {
text: string,
mention?: string[],
}
export interface ImagePayload {
url: string,
}
export interface UrlPayload {
sourceUrl: string,
title: string,
summary: string,
imageUrl: string,
}
export interface FilePayload {
url: string,
name: string,
}
export type MessagePayload = TextPayload | ImagePayload | UrlPayload | FilePayload
export interface IBotMsg {
chatId?: string,
token?: string,
messageType?: MessageType
payload: MessagePayload // this creates the problem
}