我正在尝试将我的应用迁移到打字稿。我有一个基础类,它是我的基础库对象。我创建的类依赖于基类。下面是我的问题的一瞥。
以下代码有效,但是自动完成功能无效。无法弄清楚应该为Model
的类型定义什么。
const map = new WeakMap();
function weakRef<T>(context: T): T {
// @ts-ignore
if (!map.has(context)) { map.set(context, {}); }
// @ts-ignore
return map.get(context);
}
function getModel(provider: Provider) {
return class Model {
getSomething(key: string) {
return weakRef(provider).configuration(key);
}
};
}
class Provider {
configuration: (key: string) => string;
constructor() {
weakRef(this).configuration = (key: string) => {
return key;
};
weakRef(this).Model = getModel(this);
}
get Model(): any {
return weakRef(this).Model;
}
set Model(model: any) {
weakRef(this).Model = model;
}
}
const provider = new Provider();
const obj = new (provider.Model)();
console.log(obj.getSomething('test')); // This works, but autocomplete doesn't
我不想将提供程序传递给基本模型中的构造函数。 谢谢您的帮助。
答案 0 :(得分:2)
您可以使用ReturnType<T>
获得函数类型的返回类型。
在这种情况下,ReturnType<typeof getModel>
应该可以解决问题。
您还可以通过将//@ts-ignore
约束为对象类型来固定T
行。
const map = new WeakMap();
function weakRef<T extends object>(context: T): T {
if (!map.has(context)) { map.set(context, {}); }
return map.get(context);
}
也就是说,我认为这种架构不必要地复杂。为什么不只使用this
而不是绑定到this
的值?