Функция, которая возвращает функцию, которая извлекает переменную-член - PullRequest
0 голосов
/ 28 сентября 2018

Рассмотрим:

const compose = <S, T, R>(func1: (inp2: T) => R, func2: (inp: S) => T): (inp: S) => R => ((arg: S) => func1(func2(arg)));
const not = (val: boolean): boolean => !val;
const equals = <T>(val1: T): (val2: T) => boolean => ((val2: T): boolean => (val1 == val2));

и класс

class MyClass {
  constructor(public readonly name: string) { }
}

Ниже приведены два способа поиска в списке myarray для MyClass с именем "find me":

(1) Поиск с использованием

myarray.filter(compose(equals("find me"), (c: MyClass): string => c.name));

(2) Добавить public getName(): string {return this.name; } к определению класса и поиск с использованием

myarray.filter(compose(equals("find me"), MyClass.prototype.getName.bind));

Вопрос: Оба варианта многословны.Можно ли определить функтор, который принимает класс и переменную-член и возвращает «получатель» для этой переменной-члена?

1 Ответ

0 голосов
/ 28 сентября 2018

Мы можем использовать keyof для создания такой функции безопасным для типов способом:

const get = <T, K extends keyof T>(cls: new (...a: any[]) => T, key: K) => (c: T) => c[key];
var found = myarray.some(compose(equals("find me"), get(MyClass, 'name')));

Еще одним упрощением будет создание функции построителя, предназначенной для класса.Это может быть сохранено для класса в качестве статического члена или в виде отдельной переменной в зависимости от того, как вы хотите разделить проблемы в своем коде:

const getBuilder = <T>(cls: new (...a: any[]) => T) => <K extends keyof T>(key: K) => (c: T) => c[key];
class MyClass {
  constructor(public readonly name: string) { }
  static get = getBuilder(MyClass); // getter builder on class
}
let myarray: MyClass[] = []
const myClassGet = getBuilder(MyClass);// class dedicated builder 
var found = myarray.some(compose(equals("find me"), myClassGet('name')));
var found2 = myarray.some(compose(equals("find me"), MyClass.get('name')));
...