Как сделать фильтр generi c, который возвращает элементы массива, переданные в generi c <T> - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть Parent интерфейс, который расширен на ChildA и ChildB;

interface Parent {
  sharedProp: string,
}

interface ChildA extends Parent { 
  onlyInA: string,
}

interface ChildB extends Parent { 
  onlyInB: number
}

У меня есть массив, который содержит типы массивов объединения:

const entities: (ChildA|ChildB)[] = [
  {
    sharedProp: "this will be B",
    onlyInA: "because Im a"
  }, {
    sharedProp: "this will be B",
    onlyInB: 12345
  }
]

Я сделал функцию non generi c, которая делает то, что я хочу:

const childrenWithCertainSharedProp = (sharedProp: string): ChildA[] => {
    return entities
        .filter(isChildA)
        .filter(e => e.sharedProp === sharedProp);
}

Я мог бы сделать console.log(childrenWithCertainSharedProp('xxx'));

Вот демонстрация.

Но, как вы можете видеть, я поставил возвращение как ChildA[], и я мог бы сделать то же самое с ChildB[].

Я хочу что-то похожее на следующее, что я не мог заставить работать:

const childrenWithCertainSharedProp = <T>(sharedProp: string): T[] => {
    return entities
        .filter(/* filter depending on T */)
        .filter(e => e.sharedProp === sharedProp);
}

По сути, мне нужно как-то набрать охрану в общем, таким образом, чтобы я удостоверился, что если я передам <ChildA>, я буду следить за тем, чтобы он фильтровал только ChildA и т. Д.

1 Ответ

0 голосов
/ 16 апреля 2020

Вам также необходимо как минимум передать аргумент, имеющий тип, так как во время выполнения машинописный текст не будет иметь никакого доступа к параметрам типа.

В качестве предупреждения это будет так же хорошо, как ваши typeGuards .

const childrenWithCertainSharedProp = <T extends ChildA | ChildB>(arr: T[], sharedProp: string): T[] => {
  return arr.filter(e => e.sharedProp === sharedProp);
}

console.log(childrenWithCertainSharedProp(entities.filter(isChildA), 'xxx')[0].onlyInA);
console.log(childrenWithCertainSharedProp(entities.filter(isChildB), 'xxx')[0].onlyInB);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...