У меня есть следующий тип (упрощенный):
type ValueRepresents = {
boolean: true
number?: false
other?: false
} |
{
boolean?: false
number: true
other?: false
} |
{
boolean?: false
number?: false
other: true
}
Мой фактический тип имеет гораздо больше возможных ключей. Есть ли способ сгенерировать этот тип из списка возможных ключей, чтобы сделать допустимым только один ключ со значением true? Что-то вроде:
type ValueTypes = "boolean" | "number" | "other"
type ValueRepresents <T extends ValueTypes> = {
[k in ValueTypes]: k extends T ? true : false
}
const a: ValueRepresents<"boolean"> = {
boolean: true,
number: false,
other: false,
}
Но я стремлюсь использовать:
// should pass
const a: ValueRepresents = { boolean: true }
// should pass
const a2: ValueRepresents = {
boolean: true,
number: false,
}
// should error
const a3: ValueRepresents = {
boolean: true,
number: true,
}
// should error
const a4: ValueRepresents = {}
Я также пробовал следуя этому ответу, но пока не добился успеха:
type ValueRepresents <T extends ValueTypes> = {
[k in Exclude<T, ValueTypes>]?: false
} & { [k in T]: true }