Получение класса машинописного текста, распознаваемого как интерфейс - PullRequest
2 голосов
/ 04 июля 2019

При попытке обновить до TypeScript 3.5 я столкнулся с проблемой с сигнатурой, которая по какой-то странной причине игнорировалась ts-компилятором, но была там годами.

Фреймворк стороннего производителя (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 неожиданно замечает это, ни одна версия машинописного текста не будет принимать что-то вроде

class MyClass implements ViewModelFunction{...}

Так есть ли способ преобразования класса в интерфейс ViewModelFunction?

Ответы [ 2 ]

1 голос
/ 10 июля 2019
const viewModel: ViewModelFunction = params => new MyClass(params);
0 голосов
/ 04 июля 2019

Вы можете перемещать 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;
}
...