[英]The intersection '…' was reduced to never
I receive an event from an API with the type of event assigned to it.我从 API 收到一个事件,事件类型分配给它。 For each type of event there is a different schema, so I created a separate type for every event.对于每种类型的事件都有不同的模式,所以我为每个事件创建了一个单独的类型。 The problem is, that Typescript reduces an intersection of events to never
, because the property type
is different for every event type.问题是,Typescript 将事件的交集减少到never
,因为每种事件类型的属性type
都不同。 What should I do to avoid this error?我应该怎么做才能避免这个错误?
Here's a simplified code:这是一个简化的代码:
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);
});
Since you create your event types with using intersection, so your left side of your handler definition can be anything intersected with ExampleEvent
so you need to define your handler type like this:由于您使用交集创建事件类型,因此处理程序定义的左侧可以与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),
};
To make event
to accept types LoginEvent
and NewMessageEvent
使event
接受类型LoginEvent
和NewMessageEvent
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.