Предполагаемый тип из типа, проиндексированного перечислением - PullRequest
1 голос
/ 07 мая 2020

Я не знаю, как объяснить, что я имею в виду, но вот что у меня есть:

enum ContactBaseType {
  Email,
  Notification
}

interface ContactBase {
  [ContactBaseType.Email]: EmailType[];
  [ContactBaseType.Notification]: NotificationType[];
}

Что я хочу сделать:

function ToggleSubscription(lookup: ContactBase, type: ContactBaseType, enumType: EmailType | NotificationType) {

  // something like this, however this gives me a "EmailType | NotificationType is not assignable to never"
  const index = lookup[type].indexOf(enumType);
}

Я пробовал несколько разных решений, и ни одно из них, похоже, не работает, поэтому я думаю, что что-то упускаю. Я пробовал использовать такие карты:

type ContactBaseFlags = ContactBaseType.Email | ContactBaseType.Notification;
type ContactBaseMap = { [K in ContactBaseFlags]: K extends ContactBaseType.Email ? EmailType[] : NotificationType[] };

// or
type ContactBaseMap: { [K in ContactBaseFlags]: EmailType[] | NotificationType[] }

Я пробовал извлечь ключ с помощью keyof, et c.

1 Ответ

1 голос
/ 07 мая 2020

попробуйте что-нибудь подобное

function ToggleSubscription<
  B extends ContactBase & {[key in T]: Array<I>}, // <- our base object
  T extends keyof B, // <- one of its keys
  I extends B[T] extends Array<infer U> ? U : never, // <- type of a related array
>(lookup: B, type: T, enumType: I) {
  // works now.
  const index = lookup[type].indexOf(enumType);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...