Полагаю, проблема в том, что компилятор не может гарантировать, что типы могут быть согласованы при вызове функции, рассмотрим следующий пример:
getCards<User>("name");
Здесь T
явно установлено на User
, нопо умолчанию список карт будет иметь значение Card & { id: number }
, поэтому они не будут совпадать.
Я подумал, что это можно исправить, установив ограничение на параметр типа, подобное приведенному ниже, но, к сожалению, это не работает:
function getCards<T extends Card & { id: number }>
Это не совсем работает, потому что тип используется в качестве аргумента типа массива.Поэтому, если вы установите для T
, например, SpecialCard
со свойством bonus
(не существует для типа Card
), и вы получите элемент из списка карт по умолчанию, вы не получите объект типа SpecialCard
, поскольку свойство будет отсутствовать.
Ваше ограничение должно быть подмножеством, а не надмножеством свойств карты, поэтому универсальный тип может вообще не подходить здесь.