Typescript: определите тип класса из возврата функции (и используйте его как тип) - PullRequest
0 голосов
/ 29 мая 2020

Есть ли способ определить класс на основе возврата функции, а затем использовать его как тип свойства в интерфейсе?

class Foo {};
function makeFoo<T extends Foo>(classType: T): T {
  return classType;
}
const Foo2 = makeFoo(Foo);
new Foo(); // OK
new Foo2(); // OK
interface IFoo {
  foo1: Foo; // OK
  foo2: Foo2; // 'Foo2' refers to a value, but is being used as a type here.
}

В реальном мире у меня есть функция, которая добавляет к классам некоторые методы c, использующие общие c типы класса. Итак,

class DataModel {}
class Foo<T extends DataModel> {}
class Bar extends Foo<DataModel> {
  getInstance() {
    return 'I am an instance';
  }
}

function addStatics<T extends DataModel, TF extends Foo<T>>(
  classType: TF,
): TF & { getStatic: () => T } {
  return Object.defineProperty(classType, 'getStatic', {
    value: () => {},
  });
}

// This is: typeof Bar & { getStatic: () => typeof DataModel; }
const BarWithStatics = addStatics(Bar);
console.log(BarWithStatics.getStatic(), new BarWithStatics().getInstance());

На самом деле он делает некоторые вещи с экземпляром singleton, но да, это его суть. Я надеялся, что есть способ сделать class BarWithStatics = addStatics(Bar), но не тут-то было.

1 Ответ

0 голосов
/ 29 мая 2020

Конечно, как только я спрошу об этом, я найду решение. Вы можете продлить возврат функции:

class BarWithStatics extends addStatics(Bar) {}
interface IFoo {
  bar: BarWithStatics;
}
...