javascript – TypeScript – 从对象创建联合
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – TypeScript – 从对象创建联合,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2106字,纯文字阅读大概需要4分钟。
内容图文
我正在使用typescript创建一个EventEmitter,我无法找到一种方法来执行以下操作:
说我有这样的界面:
interface EventEmitterSubscription { dispose(): void }
// here it is
interface EventEmitter<T extends { [key: string]: any }> {
onAnyEvent(callback: (event: { type: ???, payload: ??? }) => void): EventEmitterSubscription
// ...
}
我找不到一种方法来输入onAnyEvent回调,例如,对于像这样的eventEmitter:
EventEmitter<{ onNumberReceived: number, onCatReceived: { cat: ICat }, onPersonNameReceived: string }>
onAnyEvent字段将具有该类型
onAnyEvent(callback: (event: { type: 'onNumberReceived', payload: number } | { type: 'onCatReceived', payload: { cat: ICat } } | { type: 'onPersonNameReceived', payload: string }) => void): EventEmitterSubscription
目前我的实现界面如下:
onAnyEvent(callback: (event: { type: keyof T, payload: T[keyof T] }) => void): EventEmitterSubscription
除了当前不起作用,例如会产生类型onAnyEvent(callback:(event:{type:’onNumberReceived’,payload:number} | {
type:’onNumberReceived’,payload:{cat:ICat}} | / * … * /)=> void):EventEmitterSubscription
那么如何键入onAnyEvent字段?
解决方法:
创建联合的一种可能方法是使用映射类型,每个属性具有所需联合的一个元素的类型,如下所示:
type EventTypeMap<T extends { [key: string]: {} }> =
{ [K in keyof T]: { type: K; payload: T[K] } };
然后,您可以定义通用联合类型
type CallbackEventTypes<T extends { [key: string]: {} }> =
EventTypeMap<T>[keyof EventTypeMap<T>]
并使用它
interface EventEmitterSubscription { dispose(): void }
interface EventEmitter<T extends { [key: string]: {} }> {
onAnyEvent(callback: (event: CallbackEventTypes<T>) => void): EventEmitterSubscription
// ...
}
interface ICat { meow() }
type Emitter = EventEmitter<{ onNumberReceived: number, onCatReceived: { cat: ICat }, onPersonNameReceived: string }>
type HandlerType = Emitter['onAnyEvent'];
// inferred as
//type HandlerType =
// (callback: (event: { type: "onNumberReceived"; payload: number; }
// | { type: "onCatReceived"; payload: { cat: ICat; }; }
// | { type: "onPersonNameReceived"; payload: string; }
// ) => void) => EventEmitterSubscription
内容总结
以上是互联网集市为您收集整理的javascript – TypeScript – 从对象创建联合全部内容,希望文章能够帮你解决javascript – TypeScript – 从对象创建联合所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。