Type guard does not narrow the same as if-statement
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 25/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- À l'abandon
- Stack technique
- typescript
- Domaine
- compilers
Piste de recherche
Commencez par la reproduction fournie dans Playground et comparez les vérifications directes de enum avec le garde de type isE1 défini par l’utilisateur. Étudiez le narrowing par le flux de contrôle de TypeScript pour les unions discriminées et vérifiez le résultat attendu : le troisième exemple devrait réduire obj.data.object.x à "e1". Ajoutez ou mettez à jour un test de régression si l’emplacement pertinent des tests du compilateur est identifié.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
TypeScript Version: 3.5.1
Search Terms:
- Type guard function
- If-statement guard
- Narrow
- Discriminated union
Code
enum E1 {
element0 = "element0",
element1 = "element1",
element2 = "element2",
}
enum E2 {
element3 = "element3",
element4 = "element4",
element5 = "element5",
}
declare const obj : (
| {
type : E1,
data : {
object : {
x : "e1"
}
}
}
| {
type : E2,
data : {
object : {
x : "e2"
}
}
}
);
if (obj.type == E1.element0) {
//OK
const type : "element0" = obj.type;
//OK
const x : "e1" = obj.data.object.x;
}
if (
obj.type == E1.element0 ||
obj.type == E1.element1 ||
obj.type == E1.element2
) {
//OK
const type : "element0"|"element1"|"element2" = obj.type;
//OK
const x : "e1" = obj.data.object.x;
}
declare function isE1 (mixed : unknown) : mixed is E1;
if (isE1(obj.type)) {
//OK
const type : "element0"|"element1"|"element2" = obj.type;
//Expected : OK
//Actual : Error; Type '"e1" | "e2"' is not assignable to type '"e1"'.
const x : "e1" = obj.data.object.x;
}
Expected behavior:
2nd and 3rd examples should both work.
Actual behavior:
2nd example works.
3rd example does not work.
Playground Link:
Related Issues:
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.4k
- Merge moyen
- 1 j 19 h
- PR mergées (30 j)
- 117
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.
Autres issues de microsoft/TypeScript
-
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
microsoft/TypeScript#64322 · 2 commentaires · 1 réaction · 2 personnes assignées ·
-
Possible Improvement
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
microsoft/TypeScript#64278 · 1 commentaire · 1 réaction ·
-
Docs
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
microsoft/TypeScript#64118 · 1 commentaire ·
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
microsoft/TypeScript#64094 ·
-
Docs
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
microsoft/TypeScript#63959 · 5 commentaires ·
Toutes les issues de microsoft/TypeScript
Issues similaires
-
optimization optimization:agents-md-curator
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
githubnext/gh-aw-cao#13143 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
blinklabs-io/bursa#904 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
yanet-platform/ipfw-go#129 ·
-
bug confmap/provider/googlesecretmanagerprovider needs triage
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
open-telemetry/opentelemetry-collector-contrib#51273 · 2 commentaires ·
-
bug: AI Gateway client filter lists "Unknown" twice when NULL and literal Unknown clients coexist Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 90/100