typescript - 交叉点“...”减少为从不
问题描述
我从 API 接收到一个事件,该事件具有分配给它的事件类型。对于每种类型的事件都有不同的模式,所以我为每个事件创建了一个单独的类型。问题是,Typescript 将事件的交集减少到never
,因为每种事件类型的属性type
都不同。我应该怎么做才能避免这个错误?
这是一个简化的代码:
type EventType = 'login' | 'newMessage';
type ExampleEvent = {
type: EventType;
payload: unknown;
};
type LoginEvent = ExampleEvent & {
type: 'login';
payload: {
userId: string;
};
};
type NewMessageEvent = ExampleEvent & {
type: 'newMessage';
payload: {
messageId: string;
};
};
const loginEvent = {
type: 'login',
payload: {
userId: 'abc',
},
};
const newMessageEvent = {
type: 'newMessage',
payload: {
messageId: 'abc',
},
};
const events = [loginEvent, newMessageEvent];
const handlers = {
login: (event: LoginEvent) =>
console.log('user logged in', event.payload.userId),
newMessage: (event: NewMessageEvent) =>
console.log('new message', event.payload.messageId),
};
events.forEach(event => {
// Argument of type '{ type: string; payload: { userId: string; }; } | { type: string; payload: { messageId: string; }; }' is not assignable to parameter of type 'never'.
// The intersection '...' was reduced to 'never' because property 'type' has conflicting types in some constituents.
// Type '{ type: string; payload: { userId: string; }; }' is not assignable to type 'never'.
handlers[event.type as EventType](event);
});
解决方案
由于您使用交集创建事件类型,因此您的处理程序定义的左侧可以是任何相交的东西,ExampleEvent
因此您需要像这样定义您的处理程序类型:
const handlers: {
[K in EventType] : (event: ExampleEvent & any) => void
} = {
login: (event: LoginEvent) =>
console.log('user logged in', event.payload.userId),
newMessage: (event: NewMessageEvent) =>
console.log('new message', event.payload.messageId),
};
使event
接受类型LoginEvent
和NewMessageEvent
推荐阅读
- java - Spark java.lang.RuntimeException:标量子查询中的意外运算符
- c# - 在 C# 中发送参数时,如何从查询中接收一组数据?
- ruby-on-rails - 一张父表,两张子表
- python - 取一个非负数并输出一对
- xcode - 无法在“Macintosh HD”上安装 Xcode,因为需要 macOS 版本 10.13.6 或更高版本
- python - 如何创建唯一密钥对字典的字典?
- r - arulesViz 下标越界 paracoord
- excel - 安装程序中的 dll 是否只能在一个系统上运行?
- typescript - Typescirpt 映射在 redux reducer factory 类型中的类型问题
- r - 具有 13 个独立协变量的 Cox 模型上的偏差残差诊断 - 任何方式我都可以获得每个协变量的图?