microsoft / microsoft/TypeScript

Variables that are used-before-assigned are typed without `undefined`

Ouverte
#53,306 2 commentaires 2 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Awaiting More Feedback Suggestion
Langage dominant
Go
Étoiles
111k
Forks
14.4k
Merge moyen
1 j 19 h
PR mergées (30 j)
117

Description

Bug Report

🔎 Search Terms

variable use before assign

🕗 Version & Regression Information
  • This is the behavior in every version I tried
⏯ Playground Link

Playground link with relevant code

💻 Code
let xx: number;

  xx.toFixed();
// ^?
// typeof xx === number ❌

let yy!: number;

  yy.toFixed();
// ^?
// typeof yy === number ✅
🙁 Actual behavior

TS reports the type of the used-before-assigned variable xx as number, and reports error Variable 'xx' is used before being assigned. (2454)

🙂 Expected behavior

TS reports the type of xx as number | undefined.

Additional info

This behaviour makes it difficult for us to write lint rules because when we attempt to check if the variable is undefined, the type system reports that it is not.

Examples:

  • checking for unnecessary conditions based on types
    • if (xx != null) {} The types say xx is number, so != null looks like it's unnecessary.
  • checking for unnecessary type assertions
    • xx! Again the types say xx is number, so the non-null assertion looks like it's unnecessary.

Example issue:

In the past we've manually coded up logic to do used-before-assigned checks where necessary - but it's pretty gnarly code to maintain and we have to ensure that we cover this case in our implementation.

It would be great if TS reported the "correct" type here with undefined.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par le TypeScript Playground lié et reproduisez la différence entre let xx: number et let yy!: number. Suivez l’impact de l’analyse de l’utilisation avant affectation sur le type signalé, et comparez avec la gestion existante de typescript-eslint liée dans l’issue. Le travail est terminé lorsque la première variable est exposée comme number | undefined sans casser le diagnostic ni le cas avec assertion de non-nullité.

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é
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
30/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.