如何用查找类型激怒 TSC

How to anger TSC with Lookup types

我希望 Typescript 编译器 (TSC) 在我输入错误的签名时对我生气。

export class EventEmitter<EventTypes extends { [key: string]: any }> {
    subscribe<Event extends keyof EventTypes>(type: keyof EventTypes, fn: <T extends EventTypes[Event]>(value: T) => any) {

    }
}

export class Data {
    name: string;
}

export class Experiment extends EventEmitter<{ "next": Data, "end": Data[] }> {

}

new Experiment().subscribe("end", (v: Date) => {});

据我了解,tsc 应该对 (v: Date) 不满意,因为 Date 不是 Data[]。我怎样才能做到这一点?

我把事情复杂化了。解决方案很简单。

export class EventEmitter<EventTypes extends { [key: string]: any }> {
    subscribe<Event extends keyof EventTypes>(type: Event, fn: (value: EventTypes[Event]) => any) {

    }
}

请注意 type 参数如何从 keyof EventTypes 更改为 Event。这就是它的症结所在。