我违反了哪条TS规则?我要怎么重写呢?
interface Event1 {
name: 'Event1'
age: number
}
interface Event2 {
name: 'Next2'
lastName: string
}
type UnionEvent = Event1 | Event2
interface EventHandler<T extends UnionEvent> {
matcher: (node: UnionEvent) => node is Extract<UnionEvent, T>;
handler: (node: T) => void;
}
const listeners: EventHandler<UnionEvent>[] = [];
export const addEventHandler = <T extends UnionEvent>(
handler: EventHandler<T>
) => {
listeners.push(handler);
// ^ Argument of type 'EventHandler<T>' is not assignable to parameter of type 'EventHandler<UnionEvent>'.
};
any
的下一个变种,但它不被视为解决方案
// any
interface EventHandler<T extends UnionEvent = any> {
matcher: (node: UnionEvent) => node is Extract<UnionEvent, T>;
handler: (node: T) => void;
}
// array of any 👎
const listeners: EventHandler[] = [];
export const addEventHandler = <T extends UnionEvent>(
handler: EventHandler<T>
) => {
listeners.push(handler);
};
我try 使用从基事件类继承
interface BaseEvent {
name: string
}
interface Event1 extends BaseEvent {
name: 'Event1'
age: number
}
interface Event2 extends BaseEvent {
name: 'Next2'
lastName: string
}
interface EventHandler<T extends BaseEvent> {
matcher: (node: UnionEvent) => node is Extract<UnionEvent, T>;
handler: (node: T) => void;
}
const listeners: EventHandler<BaseEvent>[] = [];
export const addEventHandler = <T extends BaseEvent>(
handler: EventHandler<T>
) => {
listeners.push(handler);
// ^ Argument of type 'EventHandler<T>' is not assignable to parameter of type 'EventHandler<UnionEvent>'.
};