microsoft / microsoft/TypeScript
discriminated union type matching behaviour changed starting from 5.2.x
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
🔎 Search Terms
"key order when matching object types" "discriminated unions key order"
🕗 Version & Regression Information
- This changed between versions 5.1 and 5.2
⏯ Playground Link
💻 Code
type Food = 'apple' | 'orange';
type Vegetable = 'spinach' | 'carrot';
type Other = 'milk' | 'water';
type Custom = 'air' | 'soil';
type Target =
| {
audience: 'earth';
meal:
| Custom
| `fruit_${Food}`
| `vegetable_${Vegetable}`
| `other_${Other}`;
}
| {
audience: 'mars' | 'jupiter';
meal: string;
}
const vegetable: Vegetable = 'carrot';
// ok
const target: Target = {
audience: 'earth',
meal: `vegetable_${vegetable}`
};
// TS Error
// Type '{ meal: string; audience: "earth"; }' is not assignable to type 'Target'.
// Types of property 'audience' are incompatible.
// Type '"earth"' is not assignable to type '"mars" | "jupiter"'
const target2: Target = {
meal: `vegetable_${vegetable}`,
audience: 'earth'
};
Output
"use strict";
const vegetable = 'carrot';
const target = { // ok
audience: 'earth',
meal: `vegetable_${vegetable}`
};
const target2 = { // error
meal: `vegetable_${vegetable}`,
audience: 'earth'
};
Compiler Options
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
"strictBindCallApply": true,
"noImplicitThis": true,
"noImplicitReturns": true,
"alwaysStrict": true,
"esModuleInterop": true,
"declaration": true,
"target": "ES2017",
"jsx": "react",
"module": "ESNext",
"moduleResolution": "node"
}
}
Playground Link: Provided
🙁 Actual behavior
In the code both target and target2 have the correct structure based on the Target type.
But the order of keys is reversed in target2 which used to work but not anymore.
🙂 Expected behavior
Both target and target2 should be valid.
Additional information about the issue
Discriminated unions didn't rely on the key ordering AFAIK.
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 proporcionada en Playground y compara su comportamiento en TypeScript 5.1 y 5.2.2. Confirma si se aceptan ambos órdenes de propiedades, luego sigue el comportamiento de matching de la unión discriminada y añade una prueba de regresión si se puede identificar la ubicación de prueba relevante. Se considera completado cuando el ejemplo con las claves invertidas pasa la comprobación de tipos sin debilitar los demás diagnósticos.
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
- 38/100