我不确定如何解释我的意思,但这就是我的意思:
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等提取密钥。
答案 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);
}