如何正确注释缓存的混合

问题描述

export function Mixin(base) {
  return class extends base {
    foo = "bar";
  }
}

class A extends Mixin(SuperClass) {

}

let a = new A;
a. // suggests foo

这很好用,但就我而言,SuperClass通常是同一构造函数,因此我认为实现缓存是个好主意。

let cache = new Map();
export function Mixin(base) {
  if (!cache.has(base)) {
    cache.set(base,class extends base {
      foo = "bar";
    })
  }
  return cache.get(base);
}

class A extends Mixin(SuperClass) {

}

let a = new A;
a. // no longer suggests foo

因此,为了恢复自动完成功能,我将操作分为两个功能。

let cache = new Map();

function Mixin(base) {
  return class extends base {
    foo = "bar";
  }
}

/** 
 * @returns {ReturnType<Mixin>} 
 */
export function Cached(base) {
  if (!cache.has(base)) {
    cache.set(base,Mixin(base));
  }

  return cache.get(base);
}

class A extends Cached(HTMLElement) {}

let a = new A();

a. // suggests foo
a.inn // does not suggest innerHTML

如何注释Cached的返回值,使其知道它将扩展base

我正在考虑以下内容,只是无法弄清楚什么是正确的语法:

/** 
 * @param {T} base
 * @returns {ReturnType<Mixin> extends T} 
 */
export function Cached(base) {

解决方法

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

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

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