作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一种输入对象的方法,其中键是特定类型的“事件”字段的值,值是回调数组,该数组采用相同类型数据子类型的对象。
我曾尝试使用映射类型,但我是 typescript 的初学者并且真的很挣扎。
// I have this type structure, where the event is always a string, but the data can be anything (but is constrained by the event)
interface EventTemplate {
event: string;
data: any;
}
export interface CreateEvent extends EventTemplate {
event: 'create_game';
data: {
websocketID: 'string';
};
}
export interface JoinEvent extends EventTemplate {
event: 'join_game';
data: {
gameID: 'string';
};
}
export interface MessageEvent extends EventTemplate {
event: 'message';
data: string;
}
export type WSEvent = CreateEvent | JoinEvent | MessageEvent;
// I want an object like this
type callbacks = {
[key in WSEvent['event']]: ((data: WSEvent['data']) => void)[];
};
// Except that it forces the data structure to match with the key used. IE using a specific WSEvent rather than a generic one
// Something along the lines of:
type callbacks = {
[key in (T extends WSEvent)['event']]: ((data: T['data']) => void)[];
};
// ...only valid..
const callbacks: callbacks = {
// So this should be valid:
message: [(data: MessageEvent['data']): void => {}, (data: MessageEvent['data']): void => {}],
// But this should not be valid, as CreateEvent doesn't have the event 'join_game'
join_game: [(data: CreateEvent['data']): void => {}],
};
如果有帮助,我很乐意重组上述任何内容。
最佳答案
我们本质上需要的是一种通过提供事件名称来查找整个事件类型的方法。这可以使用 conditional helper type 来完成。
type EventByName<E extends WSEvent['event'], T = WSEvent> = T extends {event: E} ? T : never;
E
必须是事件名称之一。第二个是我们试图缩小范围的联合类型。默认为
WSEvent
所以没有必要指定它。然后条件表达式只返回联合类型中扩展
{event: E}
的那些事件。 (其中
E
是事件名称)。
type Callbacks = {
[E in WSEvent['event']]: ((data: EventByName<E>['data']) => void)[];
};
callbacks
名称的旁注.对于类型,建议使用 PascalCase。它可以更容易地与变量区分开来。我在示例中将其更改为
Callbacks
.
关于typescript - 如何将联合类型指定为对象键 Typescript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57784613/
我是一名优秀的程序员,十分优秀!