Type narrowing is lost when using logical OR assignment
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- À l'abandon
- Stack technique
- typescript
- Domaine
- compilers
Piste de recherche
Commencez avec le TypeScript Playground lié et reproduisez la différence entre curr || (curr = {}) et curr ||= {} pour les versions indiquées. Suivez le comportement du rétrécissement du flux de contrôle pour l'affectation logique ; c'est terminé lorsque le code équivalent est vérifié par le système de types sans l'erreur TS2322 signalée.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Bug Report
🔎 Search Terms
logical assignment, narrowing
🕗 Version & Regression Information
The behaviour is consistent across all versions since the introduction of logical assignment operators in TypeScript 4.0.
Checked range from 4.0.5 to Nightly, no changes in behaviour observed.
⏯ Playground Link
Playground link with relevant code
💻 Code
type F = () => number;
type R = {
[ x: string ]: R | F | undefined
}
const isFunc = <T extends (...args: any[]) => any>(maybe:unknown) : maybe is T => typeof maybe === "function";
const check = (i: R) => {
let tmp:R = i;
let curr = tmp["something"]; // R | F | undefined, expected
if( isFunc<F>(curr) ) return;
curr // R | undefined, expected
tmp = curr || (curr = {}); //ok, expected
tmp = curr ||= {}; // Type 'R | F' is not assignable to type 'R'.
};
🙁 Actual behavior
Error 2322 on the second tmp assignment because R | F is not narrowed to R as with the curr || (curr = {})
🙂 Expected behavior
No error since both assignments to tmp are functionally equivalent
(I might be missing something obvious about how logical assignment is intended to work from the type system standpoint)
- 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
-
kind/bug
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
kubernetes-sigs/prow#953 · 1 commentaire ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
caddyserver/caddy#8046 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
-
L1 recommended for recruits
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
-
area/entangle bug
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100