microsoft / microsoft/TypeScript
discriminated union type matching behaviour changed starting from 5.2.x
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.4k
- Merge moyen
- 1 j 19 h
- PR mergées (30 j)
- 117
Description
🔎 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.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par la reproduction fournie dans Playground et comparez son comportement dans TypeScript 5.1 et 5.2.2. Vérifiez si les deux ordres de propriétés sont acceptés, puis suivez le comportement de matching de l’union discriminée et ajoutez un test de régression si l’emplacement de test pertinent peut être identifié. C’est terminé lorsque l’exemple avec les clés inversées passe le contrôle de typage sans affaiblir les autres diagnostics.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 38/100