从枚举索引的类型推断出的类型

时间:2020-05-07 16:52:59

标签: typescript

我不确定如何解释我的意思,但这就是我的意思:

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等提取密钥。

1 个答案:

答案 0 :(得分:1)

尝试类似的事情

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);
}