【发布时间】:2021-01-22 06:58:25
【问题描述】:
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) {
【问题讨论】:
-
只是一个疯狂的猜测,没有太多来自 JS,但可能是因为
cache无论如何都没有输入,所以return cache.~~是未知的,因此没有建议。 -
@RicHard 是的,确实可以是
cache或Mixin的返回值,这并不重要,问题是如何给它正确的类型。 -
我认为你能得到的最接近的是: /*** @type {{foo, 不管}} */ let a = new A; a.whatever // 将完成。
-
@RicHard 必须有一个正确的语法来获取匿名类而不必复制信息,即使必须命名该类仍然是一个有效的解决方案,但即便如此我还是失败了解决问题。
-
嘿,您最终找到解决方案了吗?
标签: javascript visual-studio-code intellisense mixins jsdoc