将打字稿 class 识别为接口

Getting a typescript class recognized as an interface

在尝试升级到 TypeScript 3.5 时,我遇到了一个签名问题,由于某种奇怪的原因,该签名已被 ts-compiler 忽略,但多年来一直存在。

第三方框架 (knockoutJS) 要求我传递符合以下要求的内容:

interface ViewModelFunction {
    (params?: any): any;
}

显然在运行时它可以像这样工作:

class MyClass {
  public foobar: string;
  constructor(params: { foo: string; bar: number }) {
    this.foobar = params.foo + params.bar;
  }
  public doSomething = () => {
    return this.foobar.length;
  }
}

然后将 MyClass 发送到需要 ViewModelFunction 作为属性的函数中。由于代码有效,这主要是打字稿问题。虽然这是一个谜(但不重要为什么)ts3.5 突然注意到这一点,没有任何版本的 typescript 会接受类似

class MyClass implements ViewModelFunction{...}

那么是否有任何方法可以将 Class 转换为 ViewModelFunction 接口?

您可以将 doSomething 和 public foobar 移动到一个接口,并具有创建实现该接口和 ViewModelFunction 的对象的函数。

interface ViewModelFunction {
  (params?: any): any;
}

interface MyClass {
  foobar: string;
  doSomething(): number;
}

interface MyF extends MyClass, ViewModelFunction {}

function getMyF(foobar: string): MyF {
  const res = () => {yourViewModel();};
  res.foobar = foobar;
  res.doSomething = () => foobar.length;
  return res;
}
const viewModel: ViewModelFunction = params => new MyClass(params);