microsoft / microsoft/TypeScript
Inconsistent typing of endless generators between functions and lambdas
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.3k
- Merge moyen
- 2 j 4 h
- PR mergées (30 j)
- 132
Description
🔎 Search Terms
inconsistent generator lambda
inconsistent generator anonymous
inconsistent generator
wrong generator lambda
🕗 Version & Regression Information
This is the behavior in every version I tried, and I reviewed the FAQ for entries about generators
⏯ Playground Link
💻 Code
function* test() {
while (true) yield 0;
}
let yieldsOnce = function*() {
yield 0;
}
let yieldsAlways = function*() {
while (true) yield 0;
}
yieldsOnce = test;
yieldsAlways = test;
// the last line shows error
// Type '() => Generator<number, void, unknown>' is not assignable to type '() => Generator<number, never, unknown>'.
// Call signature return types 'Generator<number, void, unknown>' and 'Generator<number, never, unknown>' are incompatible.
// The types returned by 'next(...)' are incompatible between these types.
// Type 'IteratorResult<number, void>' is not assignable to type 'IteratorResult<number, never>'.
// Type 'IteratorReturnResult<void>' is not assignable to type 'IteratorResult<number, never>'.
// Type 'IteratorReturnResult<void>' is not assignable to type 'IteratorReturnResult<never>'.
// Type 'void' is not assignable to type 'never'.(2322)
🙁 Actual behavior
Despite both having the same body, the function test has the type Generator<number, void, unknown>, yet the variable yieldsAlways has the type Generator<number, never, unknown>. The compiler seems to have understood the test function incorrectly, so the test code cannot do yieldsAlways = test.
🙂 Expected behavior
If the compiler knows that the lambda assigned to yieldsAlways never finishes, it should know that about the test function as well.
The code should be able to do yieldsAlways = test.
Additional information about the issue
No response
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 exécuter la reproduction fournie dans TypeScript Playground et comparez les types de générateur inférés pour la fonction nommée et la lambda. Suivez l’inférence du type de retour du générateur utilisée pour ces deux formes ; c’est terminé lorsque les deux reçoivent des types de retour compatibles et que l’affectation yieldsAlways = test ne signale plus d’erreur.
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é
- Active
- Clarté
- Plutôt claire
- Accessibilité débutants
- 48/100