我正在学习TypeScript。我为WhatsApp消息对象创建了我的类型,它根据消息类型发送一些属性:
// (edited and completed according to wonderflame comment)
type WhatsAppMessageObject = {
id: string,
from: string,
type: string,
audio?: {
id?: string,
mime_type?: string
},
document?: {
caption?: string,
filename: string,
sha256: string,
mime_type: string,
id: string
},
text?: {
body?: string
},
// More types. Cutted for brevity
}
type MessageData = {
type: string,
id?: string,
mimeType?: string,
optionId?: string;
message?: string;
normalizedMessage?: string;
}
字符串
因此,我确定了一些“文件”消息,即带有某种文件(文档、音频、图像等)的消息。当一些消息被发送到我的后端时,对象包括属性,即:
from: "someNumber",
id: "someId",
timestamp: "1690317478",
type: "image",
image: {
mime_type: "image/jpeg",
sha256: "someSha256",
id: "someId",
},
text?: {
body?: string
},
time
};
型
所以,我想要的是访问这个属性,如果是文件消息,文本消息或交互式消息,则执行不同的操作:
// Simplified for brevity (edited and completed according to wonderflame comment)
function handleMessageType(messageObject: WhatsAppMessageObject) {
const {from, id: messageId} = messageObject
const messageType = messageObject.type;
const fileMessages: Array<keyof WhatsAppMessageObject> = ["audio", "document"];
let messageData: MessageData = {
type: messageType,
};
// If is a file message
if (fileMessages.includes(messageType as keyof WhatsAppMessageObject)) {
messageData.id = messageObject[messageType as keyof WhatsAppMessageObject]?.id;
messageData.mimeType = messageObject[messageType as keyof WhatsAppMessageObject]?.mime_type;
// TODO: Implement saving the files
}
if(messageType === 'text') {
messageData.message = messageObject.text!.body
messageData.normalizedMessage = normalizeString(messageObject.text!.body)
}
return {messageId, from, messageData}
}
// Takes a string, make all letters lowercase and removes all special characters
function normalizeString(str = '') {
let normalizedStr = str.toLowerCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
return normalizedStr
}
型
类型,如“作为WhatsAppMessageObject的键”是由chatGPT建议的,但我无法以任何方式解决“属性'id'不存在于类型'{ body?:string| undefined; }'“(handleMessageType函数片段中的第14行,第15行“mime_type”相同)。
拜托,我做错什么了?
2条答案
按热度按时间cgvd09ve1#
让我们定义一个
WhatsAppMessageObject
的键数组,它们是FileMessage
:字符串
编译器将数组的类型扩展到基元。
string[]
不适合我们,为了防止扩展,让我们使用const assertion和satisfies操作符来确保类型检查:型
现在,使用indexed access为
FileMessage
创建一个类型,它应该是fileMessages
的元素的联合:型
由于
fileMessage
是一个数组/元组,它的键是number
,通过使用number
作为键,我们可以得到它所有值的并集。我们还需要一个自定义的类型保护来确保传递的变量是
FileMessage
:型
因此,我们可以在你的函数中使用这个类型保护:
型
Playground
tuwxkamq2#
我解决了虽然不是我想要的方式...无论如何,也许有人可以帮助我的解决方案有用,虽然不是最佳的。
所以,基本上是用“魔法字符串”填充函数(我不太喜欢,但无论如何,并不是说Meta将有数百种消息类型):
字符串
请注意,我更改了“messageType”的“type”属性。这是因为“type”是一个保留关键字。
无论如何,我希望有人能提出一个更好、更可扩展的解决方案。