Тип 'Выбрать 'не назначается типу' Partial <TTask>', где TId расширяет ключ TTask - PullRequest
0 голосов
/ 02 августа 2020

Минимальный код для воспроизведения ошибки машинописного текста.

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, но не могу придумать другого способа объявить. Приветствуются любые предложения.

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