Минимальный код для воспроизведения ошибки машинописного текста.
type OptionalExceptFor<T, TRequired extends keyof T> = Partial<T> &
Pick<T, TRequired>;
function some<
TTask extends { [id in TId]: string },
TId extends keyof TTask
>(task: Pick<TTask, TId>): OptionalExceptFor<TTask, TId> {
return task;
}
Это может показаться безумным, но я удалил все, что не связано с ошибкой. Идея такова:
TTask
- это любой интерфейс с некоторым свойством, которое рассматривается как идентификатор. - Это свойство передается в generi c как параметр типа, потому что для разных типов
TTask
это свойство может быть разным. - Идентификатор должен быть
string
. - Функция получает объект, содержащий хотя бы идентификатор (в реальном сценарии некоторые другие свойства также из общего предка
TTask
- удалены для простоты). - Функция возвращает объект, который гарантированно имеет требуемый идентификатор, и он может иметь некоторые другие свойства
TTask
но они необязательны. Я использую OptionalExceptFor
из { ссылка }.
Ошибка
Type 'Pick<TTask, TId>' is not assignable to type 'OptionalExceptFor<TTask, TId>'.
Type 'Pick<TTask, TId>' is not assignable to type 'Partial<TTask>'.
Type 'keyof TTask' is not assignable to type 'TId'.
'keyof TTask' is assignable to the constraint of type 'TId', but 'TId' could be instantiated with a different subtype of constraint 'string | number | symbol'.
Type 'string | number | symbol' is not assignable to type 'TId'.
'string | number | symbol' is assignable to the constraint of type 'TId', but 'TId' could be instantiated with a different subtype of constraint 'string | number | symbol'.
Type 'string' is not assignable to type 'TId'.
'string' is assignable to the constraint of type 'TId', but 'TId' could be instantiated with a different subtype of constraint 'string | number | symbol'.(2322)
Вот игровая площадка TypeScript .
Я чувствую, что проблема вызвана TId extends keyof TTask
, но не могу придумать другого способа объявить. Приветствуются любые предложения.