alex4answ
@alex4answ

Как работать с функциями высшего порядка?

Добрый день, есть функция высшего порядка, которая добавляет методы и свойства в классы.

typescript
class Model {
  
  prototype: any;

  static find(id: number): number {
    return id;
  }

  save(): boolean {
    return true;
  }
}

function foo<M extends Model>(model: M) { // Какой тип она должна вернуть ?
  model.prototype.create = function (): void {
    // do something
  };

  model.findAll = function (): number[] { // Error Property 'findAll' does not exist on type 'M'.
    return [1, 2, 3];
  }

  return model;
}


Столкнулся с 2 проблемами, которые никак не могу нагуглить и понять.

1. Какой тип должна возвращать эта функция ?
Пробовал создать класс с добавленными методами, свойствами и возвращать его тип:
class NewModel {
  create(): void;
  static findAll(): number[];
}

function foo<M extends Model>(model: M): NewModel { ... }

Но компилятор ожидает от foo() объект класса NewModel, а не сам расширенный класс (думаю тут что-нибудь с typeof NewModel нужно, но разобраться не получилось покачто, только запутался)

2. Как расширять классы, если в них нет добавляемых методов/свойств?:
Error Property 'findAll' does not exist on type 'M'.
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
Расширять, очевидно, с помощью ключевого слова extends.
Всё остальное - исключительно хаки и костыли. Typescript предполагает, что класс не должен изменяться "на лету" никоим образом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Kozack
@Kozack
Thinking about a11y
Ваша функция должна возвращать Intersection Types
Примерно что-то в таком духе:
https://www.typescriptlang.org/play?#code/MYGwhgzh...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы