Как защитить фильтр типа Object.entries? - PullRequest
0 голосов
/ 02 марта 2020

I wi sh было что-то вроде entryof для ввода записей типа:

const carDude = {
  name: "Tom",
  age: 45,
  car: "Porsche 911"
}

interface Dude {
  name: string;
  age: number;
}

Object
  .entries(carDude)
  .filter((entry): entry is entryof Dude => 
    entry[0] === "name" || entry[0] === "age"
  )

Как обойти это с помощью typeguard?

1 Ответ

2 голосов
/ 02 марта 2020

Я был бы склонен определить EntryOf следующим образом:

type EntryOf<T extends object> = { [K in keyof T]: [K, T[K]] }[keyof T];

Это возьмет объект типа T и превратит его в объединение входных кортежей. Тогда ваш код может быть записан как

const ret = Object.entries(carDude).filter((entry): entry is EntryOf<Dude> =>
    entry[0] === "name" || entry[0] === "age"
);
/* const ret: (["name", string] | ["age", number])[] */

, и вы увидите, что возвращаемый тип массива имеет элементы типа ["name", string] | ["age", number], как я полагаю, вы хотели.

Надеюсь, это поможет; удачи!

Детская площадка ссылка на код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...