打字稿 - 强制值成为接口的属性
Posted
技术标签:
【中文标题】打字稿 - 强制值成为接口的属性【英文标题】:Typescript - force value to be a proprerty of an interface 【发布时间】:2021-12-03 13:53:10 【问题描述】:我正在尝试创建某种工厂来为discord.js
发出的某些事件类型创建类。
在此示例中,ClientEvents
由discord.js
定义,EventInterface
定义工厂中使用的对象/类的格式,MessageCreateEvent
是实现的示例。
我想强制实现类的name
值成为ClientEvent
的键(如下面的代码,但它不起作用),我想键入execute
的参数作为关联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`);
你能帮帮我吗?
【问题讨论】:
请提供定义所有类型的可重现示例public name: keyof ClientEvents = 'messageCreate'
?不太清楚你在这里追求什么。
我想要一种方法来强制 interactObject
与 ClientEvents[this.name]
的类型相同。
【参考方案1】:
如果您提供示例或 cmets,说明您的示例应该如何工作,以及不应该如何工作,匹配会更清晰。
但我更改了您的代码,以通过 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!`);
full example in Playground
这是你要找的吗?
【讨论】:
这显然是我想要的,谢谢!我自己找不到它,因为我没想到在args
之前添加...
(这是因为ClientEvents
格式看起来像messageCreate: [message: Message]
而不是messageCreate: Message
?
这取决于... messageCreate: [message: Message]
允许您描述所有函数参数,而使用 messageCreate: Message
您可以只为一个参数定义类型:execute: (arg0: ClientEvents[T], ...args: any[]) => Promise<void>;
以上是关于打字稿 - 强制值成为接口的属性的主要内容,如果未能解决你的问题,请参考以下文章