¿Typescript no infiere correctamente? (inferir un objeto de un tipo a partir de la unión de objetos en términos de que un campo sea una cadena concatenada)
¿Cómo puedo hacer que TypeScript infiera dentro del alcance de la declaración if que d contiene a, en el siguiente fragmento?
type Data<NS extends string> = { type: `${NS}/1`; a: string } | { type: `${NS}/2`; b: string };
const foo = <NS extends string>(name: NS, d: Data<NS>): void => {
if (d.type === (`${name}/1` as const)) {
// Property 'a' does not exist on type 'Data<NS>'. Property 'a' does not _exist on type '{ type: `${NS}/2`; b: string; }'.
d.a;
}
};
El fragmento anterior es análogo al siguiente, que infiere correctamente, pero no contiene constantes de cadena concatenadas (que es lo que necesito):
type Data<NS extends string> = { type: `1`; a: string } | { type: `2`; b: string }
const foo = <NS extends string>(name: NS, d: Data<NS>): void => {
if (d.type === (`1` as const)) {
d.a;
}
}