我正在嘗試創建某種工廠來為discord.js.
在這個例子中,ClientEvents由 定義discord.js,EventInterface定義工廠中使用的物件/類的格式,MessageCreateEvent是一個實作的例子。
我想強制name實施的類的值是一個關鍵ClientEvent(如下面的代碼,但它不作業),我想輸入的ARGSexecute是在給定鍵的相關型別ClientEvent。例如,如果name是messageCreate,并且DontKnowType應該是Message。
type Message = unknown;
type DontKnowType = unknown;
interface ClientEvents {
messageCreate: [message: Message];
}
interface EventInterface<T extends keyof { [x: string]: ClientEvents}> {
name: T,
execute: (interactObject: DontKnowType) => Promise<void | undefined>;
}
class MessageCreateEvent implements EventInterface<'messageCreate'> {
public name = 'messageCreate';
public async execute(interactObject: DontKnowType): Promise<void | undefined> {
console.info(`Message from ${interactObject?.user.tag}`);
}
}
你能幫我嗎 ?
uj5u.com熱心網友回復:
如果您提供有關示例應該如何作業以及不應該如何作業的示例或評論,則匹配會更清晰。
但是我更改了您的代碼以通過EventInterface并強制名稱成為 Message**Event 介面的一部分來驗證 Message**Event 類。
interface EventInterface<T extends keyof ClientEvents> {
name: T
execute: (...args: ClientEvents[T]) => Promise<void>;
}
class MessageCreateEvent implements EventInterface<'messageCreate'>{
public name = 'messageCreate' as const;
public async execute(message: Message): Promise<void> {
console.info(`Message from ${message!.user!.tag!}`);
}
}
Playground 中的完整示例
這是你想要的?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/317148.html
