关键词:
【中文标题】打字稿 - 强制值成为接口的属性【英文标题】: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>;
强制泛型类型成为打字稿中唯一符号的类型
】强制泛型类型成为打字稿中唯一符号的类型【英文标题】: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... 查看详情