Я был бы склонен определить 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]
, как я полагаю, вы хотели.
Надеюсь, это поможет; удачи!
Детская площадка ссылка на код