microsoft / microsoft/TypeScript
Check for missing property on union type causes failure in subsequent property checks
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
"missing property", "property check", "type union", "control flow analysis"
🕗 Version & Regression Information
- This is the behavior in every version I tried*, and I reviewed the FAQ for entries about property checks
*There was a minor change between 4.8 and 4.9 that changed the types but did not change the behavior: inference improved from never to incorrectUnionElement & Record<"key", unknown>.
⏯ Playground Link
💻 Code
interface comp1 {
readonly a: number;
readonly b: number;
}
interface comp2 {
readonly a: number;
}
type comp =
| comp1
| comp2
function do_something() {
const comp = {} as comp;
if ("a" in comp) {
comp.a.toString();
// ^? comp
}
if ("b" in comp) {
comp.b.toString();
// ^? comp1
}
if ("c" in comp) {
comp.c.toString();
// ^? comp & Record<"c", unknown>
}
if ("a" in comp) {
comp.a.toString();
// ^? comp2
}
if ("b" in comp) {
comp.b.toString();
// ^? comp2 & Record<"b", unknown>
}
}
🙁 Actual behavior
Every property check after the ("c" in comp) one fails to narrow correctly if the key is one that is only defined for some of the element types of the type union. Attempting to access the property after one of these checks results in unknown. As well, the narrowed variable in subsequent conditionals is an arbitrary(?) union element.
🙂 Expected behavior
The conditionals that come after the ("c" in comp) conditional should have the same behavior as the ones before it, as they are the exact same code.
Additional information about the issue
This was initially noticed in a more complicated context with assertions, that I can include here as a secondary example. This one is even more strange, as it is a check for a property that is only defined on some of the elements of the union and it blocks its own duplicate check later.
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 le repro fourni dans TypeScript Playground et comparez le narrowing de l’union avant et après la vérification "c" in comp. Suivez l’analyse du flux de contrôle et la gestion des vérifications de propriétés impliquées dans le narrowing des types union. C’est terminé lorsque les vérifications ultérieures effectuent le narrowing de la même manière que les vérifications identiques avant le test de la propriété manquante, y compris dans l’exemple secondaire.
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é
- Clairement spécifiée
- Accessibilité débutants
- 35/100