如何在Typescript中以适当的方式动态创建Class?

时间:2019-04-20 20:17:44

标签: javascript typescript

我正在尝试将我的应用迁移到打字稿。我有一个基础类,它是我的基础库对象。我创建的类依赖于基类。下面是我的问题的一瞥。

以下代码有效,但是自动完成功能无效。无法弄清楚应该为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

我不想将提供程序传递给基本模型中的构造函数。 谢谢您的帮助。

1 个答案:

答案 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的值?