microsoft / microsoft/TypeScript
Nullish coalescing should always include the type of the right operand
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
$ ./node_modules/.bin/tsc --version
Version 3.7.2
Search Terms:
Code
A toy example would be something like this.
let foo: string = "";
foo = "bar" ?? 123;
This one is obviously fine since "bar" is always truthy.
However, this becomes a little bit problematic when you consider the idiom of having Record objects and checking their truthiness before using them.
const elts = ["foo", "bar", "spam", "spam", "foo", "eggs"];
const counts: Record<string, number>;
for (const elt of elts) {
// This really **should** raise an error.
counts[elt] = counts[elt] ?? "zero";
counts[elt] += 1;
}
Expected behavior:
An error should be raised.
Actual behavior:
Curiously, an error is not raised in strict mode but is raised in un-strict mode.
$ ./node_modules/.bin/tsc ./foo.ts
foo.ts:5:3 - error TS2322: Type 'number | "zero"' is not assignable to type 'number'.
Type '"zero"' is not assignable to type 'number'.
5 counts[elt] = counts[elt] ?? "zero";
~~~~~~~~~~~
Found 1 error.
$ ./node_modules/.bin/tsc --strict ./foo.ts
# No error, exits 0 and emits JS.
Playground Link:
Playground Link
Toggling the strictNullChecks config option will show the issue.
Related Issues:
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
Reproduisez les exemples avec TypeScript 3.7.2 en utilisant à la fois la commande par défaut du compilateur et --strict, puis comparez les diagnostics pour l’affectation avec coalescence nulle. Le travail est terminé lorsque l’expression signalée inclut systématiquement le type de l’opérande de droite et déclenche l’erreur attendue avec la configuration indiquée.
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
- 45/100