简体   繁体   English

交叉点“……”被缩减为从不

[英]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接受类型LoginEventNewMessageEvent

Playground 操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 TypeScript 参数交集减少为从不 - TypeScript parameters intersection reduced to never Typescript 映射返回类型:交集减少为从不,交集属性冲突 - Typescript mapped return type: intersection reduced to never, conflicting intersection property 交集 '... &...' 被缩减为 'never' 因为属性 '...' 在某些成分中具有冲突的类型 - The intersection '... & ...' was reduced to 'never' because property '...' has conflicting types in some constituents 交集 'xxx & xxx' 被简化为 'never' 因为属性 'xxx' 在某些成分中具有冲突类型 - The intersection 'xxx & xxx' was reduced to 'never' because property 'xxx' has conflicting types in some constituents TypeScript 3.9.5- 交叉点“...”被简化为“从不”,因为属性“使用”在某些成分中有冲突的类型 - TypeScript 3.9.5- The intersection '…' was reduced to 'never' because property 'usage' has conflicting types in some constituents 类型联合被简化为“从不”打断打字:类型被简化为“从不”,因为属性在某些成分中具有冲突类型 - Union of types was reduced to 'never' breaks typing: Type was reduced to 'never' because property has conflicting types in some constituents Typescript Union To Intersection 返回值从不 - Typescript Union To Intersection returns values as never 为什么两个不同的文字的交集不等于从不? - Why isn't an intersection of two different literals equal to never? 为什么Typescript推断'never'而不是交集类型? - Why does Typescript infer 'never' instead of intersection type? 为什么 TypeScript 有时只将不可能的交叉点视为“从不”? - Why does TypeScript only sometimes treat an impossible intersection as 'never'?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM