El siguiente fragmento de código hace exactamente lo que pretendo saber con una advertencia: me gustaría evitar tener que explicitar el genérico que necesita.
type EventGroup = { actions: "run" | "save" other: "bla" } export type EventType<T extends keyof EventGroup> = `${T}/${EventGroup[T]}` const t: EventType<"actions"> = "actions/run"Me gustaría que Typescript infiriera que:
`actions/run` -> valid `actions/save` -> valid `actions/bla` -> NOT valid `other/bla` -> validQue es lo que hace este código pero con un genérico explícito.
Puede hacer eso con un tipo asignado y luego tomar una unión de los valores de:
export type EventType = { [Key in keyof EventGroup]: `${Key}/${EventGroup[Key]}` }[keyof EventGroup];Prueba de la validez del tipo:
const t1: EventType = "actions/run"; // valid const t2: EventType = "actions/save"; // valid const t3: EventType = "actions/bla"; // NOT valid const t4: EventType = "other/bla"; // validHay dos partes en eso, primero el tipo mapeado:
type EventType = { [Key in keyof EventGroup]: `${Key}/${EventGroup[Key]}` }que evalúa como:
type EventType = { actions: "actions/run" | "actions/save"; other: "other/bla"; } Luego usamos [keyof EventGroup] al final para extraer solo los valores de las actions y other como una unión.