为什么不能将泛型类的“ typeof”子类分配给原始类的“ typeof”?

问题描述

我正在尝试在可扩展类中实现"nanoevents"库。

您可以在此处查看库的相关类型定义:https://github.com/ai/nanoevents/blob/128fac9/index.d.ts

// this is straight from the above link,only used as reference

interface EventsMap {
  [event: string]: any
}

interface DefaultEvents extends EventsMap {
  [event: string]: (...args: any) => void
}

// ...

export declare class Emitter<Events extends EventsMap = DefaultEvents> {
  // ...

   events: Partial<{ [E in keyof Events]: Events[E][] }>

  // ...

  on<K extends keyof Events> (this: this,event: K,cb: Events[K]): Unsubscribe

  // ...
}

我想将我的类定义为泛型,以便继承的子类可以定义其相关事件并利用类型检查。

import { createNanoEvents,Emitter,Unsubscribe } from "nanoevents";

class Extendable<Events extends {}={}>
{
  protected _emitter:Emitter<Events> = createNanoEvents<Events>();

  public on<E extends keyof Events>(event:E,callback:Events[E]):Unsubscribe
  {
    return this._emitter.on(event,callback);
  }
}

在这里成功地扩展了我的课程:

interface ExtendedEvents {
    'a':()=>void,'b':(c:number)=>void,}

class Extended<Events extends ExtendedEvents=ExtendedEvents> extends Extendable<Events>
{
}

现在我想将其传递给以下功能

function foo(extendableType:typeof Extendable):void { /* ... */ }
foo(Extended); // <-- error here

哪个失败:

TS2345: Argument of type 'typeof Extended' is not assignable to type 'typeof Extendable'.
  Construct signature return types 'Extended<ExtendedEvents>' and 'Extendable<Events>' are incompatible.
    The types of '_emitter.events' are incompatible between these types.
      Type 'Partial<{ a: (() => void)[]; b: ((c: number) => void)[]; }>' is not assignable to type 'Partial<{ [E in keyof Events]: Events[E][]; }>'.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)