microsoft / microsoft/TypeScript
Misleading error message for missing properties in types composed of the intersection of certain multiple unions
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.4k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
Bug Report
🔎 Search Terms
intersection of union required property error message
🕗 Version & Regression Information
This is the behavior in every version I tried, and I reviewed the FAQ for entries about it
I use the playground and observed the same behavior for versions 4.2 through 4.9
⏯ Playground Link
Playground link with relevant code
💻 Code
type Arg = (
| {
prefLabel?: string;
showPref: false;
}
| {
prefLabel: string;
showPref?: true;
}
)
& (
| { other: false; }
| { other: true; }
);
const fn = (thing: Arg) => {};
fn({ showPref: false }); // <<< error on this line
fn({ showPref: false, other: true }); // <<< this is ok
🙁 Actual behavior
I see an error for fn({ showPref: false });:
Argument of type '{ showPref: false; }' is not assignable to parameter of type 'Arg'.
Type '{ showPref: false; }' is not assignable to type '{ prefLabel: string; showPref?: true | undefined; } & { other: true; }'.
Property 'prefLabel' is missing in type '{ showPref: false; }' but required in type '{ prefLabel: string; showPref?: true | undefined; }'.(2345)
input.tsx(7, 7): 'prefLabel' is declared here.
This is wrong because actually other is missing. The following line does not produce an error
🙂 Expected behavior
I would expect the error message to refer to the missing required property, not to an irrelevant union member
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con la reproducción enlazada de TypeScript Playground y compara el diagnóstico de las dos llamadas a fn que implican intersecciones de unions. Sigue cómo el compilador selecciona el miembro de la union y la propiedad que faltan; se considera terminado cuando la primera llamada informa de la propiedad other que falta en lugar de la propiedad irrelevante prefLabel, mientras que la segunda sigue siendo válida.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 42/100