от
При попытке обновить до 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 Ответы

0 голосов
от
const viewModel: ViewModelFunction = params =
0 голосов
от
Вы можете переместить
doSomething
и общедоступный
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 = () =
...