打字稿 - 强制值成为接口的属性

Posted

技术标签:

【中文标题】打字稿 - 强制值成为接口的属性【英文标题】:Typescript - force value to be a proprerty of an interface 【发布时间】:2021-12-03 13:53:10 【问题描述】:

我正在尝试创建某种工厂来为discord.js 发出的某些事件类型创建类。

在此示例中,ClientEventsdiscord.js 定义,EventInterface 定义工厂中使用的对象/类的格式,MessageCreateEvent 是实现的示例。

我想强制实现类的name 值成为ClientEvent 的键(如下面的代码,但它不起作用),我想键入execute 的参数作为关联ClientEvent 中给定键的类型。例如,如果namemessageCreate,那么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'?不太清楚你在这里追求什么。 我想要一种方法来强制 interactObjectClientEvents[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[]) =&gt; Promise&lt;void&gt;;

以上是关于打字稿 - 强制值成为接口的属性的主要内容,如果未能解决你的问题,请参考以下文章

打字稿。为啥功能接口中描述的“返回值”类型没有严格执行?

如何在打字稿接口/类型中将枚举值类型转换为数组?

将打字稿接口属性类型转换为联合[重复]

如何在打字稿上制作多种类型的属性接口

具有命名属性和不同类型的任意命名索引属性的打字稿接口[重复]

打字稿接口变量空检查并设置默认值