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

     2023-03-14     11

关键词:

【中文标题】打字稿 - 强制值成为接口的属性【英文标题】: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;;

强制泛型类型成为打字稿中唯一符号的类型

】强制泛型类型成为打字稿中唯一符号的类型【英文标题】:Forcegenerictypetobethetypeofauniquesymbolintypescript【发布时间】:2021-11-1313:39:52【问题描述】:在阅读了thisanswer关于名义打字的内容后,我想将其更进一步exporttypeMARKED<C,M>... 查看详情

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

】如何在打字稿接口/类型中将枚举值类型转换为数组?【英文标题】:Howtotypecastenumvaluesasanarrayintypescript\'sinterface/types?【发布时间】:2021-02-1420:38:55【问题描述】:我想将interface/types属性的prop类型转换为与枚举值匹配的任何元... 查看详情

带有多个属性的对象的打字稿排序数组

】带有多个属性的对象的打字稿排序数组【英文标题】:Typescriptsortingarraywithobjectsonmultipleproperties【发布时间】:2016-05-1801:20:46【问题描述】:我喜欢用具有多个属性的对象对数组进行排序。我的对象有一个名为name的字符串和一... 查看详情

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

】如何在打字稿上制作多种类型的属性接口【英文标题】:Howcanimakemultipletypepropertyinterfaceontypescript【发布时间】:2019-04-0312:23:14【问题描述】:我想在typescript中使用两个不同的接口创建接口属性。这可能吗?interfaceIPayload1id:stri... 查看详情

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

】将打字稿接口属性类型转换为联合[重复]【英文标题】:Turntypescriptinterfacepropertytypesintounion[duplicate]【发布时间】:2022-01-0417:56:23【问题描述】:我有这个接口,我想根据它包含的键类型生成一个新类型。interfaceSomeTypeabc:string;d... 查看详情

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

】具有命名属性和不同类型的任意命名索引属性的打字稿接口[重复]【英文标题】:Typescriptinterfacewithnamedpropertyandarbitrarily-namedindexpropertiesofdifferenttype[duplicate]【发布时间】:2015-10-1205:46:37【问题描述】:我想为一个对象创建一个... 查看详情

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

】打字稿。为啥功能接口中描述的“返回值”类型没有严格执行?【英文标题】:Typescript.Whydescribed"returnvalue\'s"typeinfunctionalinterfaceisbeingnotstrictimplemented?打字稿。为什么功能接口中描述的“返回值”类型没有严格执行?【... 查看详情

打字稿:如何获取接口可接受/定义的值列表? [复制]

】打字稿:如何获取接口可接受/定义的值列表?[复制]【英文标题】:Typescript:howtogetalistofvaluesacceptable/definedbyinterface?[duplicate]【发布时间】:2021-04-2407:22:32【问题描述】:如何获取接口可接受/定义的值列表?例如,我有一个本... 查看详情

过滤掉打字稿中接口的不需要的对象属性

】过滤掉打字稿中接口的不需要的对象属性【英文标题】:filteroutunneededobjectpropertiesforinterfaceintypescript【发布时间】:2019-02-1021:24:32【问题描述】:作为背景,我使用的是Prisma(graphql)、mysql2(nodejs)和typescript。我正在使用交互式命... 查看详情

打字稿:允许泛型类型仅是具有“字符串”属性的对象

】打字稿:允许泛型类型仅是具有“字符串”属性的对象【英文标题】:Typescript:allowagenerictypetoonlybeanobjectwith\'string\'properties【发布时间】:2019-03-1014:35:21【问题描述】:我想知道是否可以在TS中强制执行泛型的属性类型。我只... 查看详情

打字稿模型到json - 忽略空值属性

】打字稿模型到json-忽略空值属性【英文标题】:typescriptmodeltojson-Ignorenullvalueproperty【发布时间】:2018-11-0921:11:18【问题描述】:在Angular4应用程序中,我的打字稿模型,exportclassPersonfname:string,lname?:stringlname是可选的。在组件中... 查看详情

打字稿中的泛型函数找不到接口属性

】打字稿中的泛型函数找不到接口属性【英文标题】:Genericsfunctionintypescriptcan\'tfindinterfaceproperty【发布时间】:2017-05-2913:26:33【问题描述】:我正在尝试使用泛型在打字稿中创建以下函数,但它向我显示以下错误:“\'CustomerInte... 查看详情

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

】打字稿接口变量空检查并设置默认值【英文标题】:typescriptinterfacevariablenullcheckandsetdefaultvalue【发布时间】:2021-02-1721:56:18【问题描述】:如何在接口变量上检查null以及如何在typescript中设置默认值?constuserModel=snap.data()asUserMo... 查看详情

打字稿:将 JSON 对象转换为类/接口对象

】打字稿:将JSON对象转换为类/接口对象【英文标题】:Typescript:ConvertJSONobjecttoaclass/interfaceobject【发布时间】:2018-10-1003:47:06【问题描述】:我正在尝试将API响应转换为typescript类/接口。这里API返回一个包含一些属性的对象列表... 查看详情

具有定义值的打字稿动态对象键

】具有定义值的打字稿动态对象键【英文标题】:Typescriptdynamicobjectkeyswithdefinedvalues【发布时间】:2020-07-1517:23:13【问题描述】:我遇到了一个问题,试图让typescript为我识别javascript对象的键,同时强制每个键的值类型,因为我... 查看详情

动态创建和分配对象属性打字稿

】动态创建和分配对象属性打字稿【英文标题】:Createandassignaobjectpropertydynamicallytypescript【发布时间】:2020-08-0416:41:06【问题描述】:我有一个这样声明的接口,exportinterfaceOurHistoryourHistory?:object;step1?:object;step2?:object;在课堂上,... 查看详情

类型转换时的打字稿默认属性

】类型转换时的打字稿默认属性【英文标题】:Typescriptdefaultpropertieswhentypecasting【发布时间】:2017-08-0402:33:26【问题描述】:有没有办法将对象类型转换为类类型,以便尊重默认属性值?例如:classPersonname:string="bob";age:number;sex:s... 查看详情

如何覆盖打字稿中的属性?

】如何覆盖打字稿中的属性?【英文标题】:HowdoIoverrideapropertyintypescript?【发布时间】:2016-10-0823:15:27【问题描述】:由于当前的语言限制,这可能是不可能的,但我使用的是最新的TS(1.8.10),并且遇到了ui-grid类型的问题。IGridOp... 查看详情