microsoft / microsoft/TypeScript

Inconsistent typing of endless generators between functions and lambdas

Ouverte
#63,970 2 commentaires 0 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.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

https://www.typescriptlang.org/play/?ts=6.0.3#code/GYVwdgxgLglg9mAVAAigUwM5QBQEpkDeAUMsgO4AWMANmstlAE4hr4CeMa1AJsgAwBuIgF8iRWlGQcu3DAHlIdALzJQkWAkR5CJKZx78ho8WknSeGAILUyAQzYZkKtdHhJtxUpRp0GzVnoyhiJiROayChDKqJhQQmH6stZ2Dk4xWPEA9JmoFHTUtljI1DBgdBgUcGSOaIyMcIxE2cgAKmwADnQA5NpKAHzIAOJoZYy2UA0APGAgALYARrUANMgAbnAw3CvgANZgVWB9XcgwjvuShRgwAOZgtvO0qHCoHd29A8Oj41MzC8vIZVW-12+zIhy6ADomjlkABhWzUajIK63cYgRh0DFQdFgF6dRxdT61b6MaZzRaMFbrTbbMB7A5HZC2MC8QkjYkTUm-CkrQHAumg8FMjEnSBwWbtcYwB5oKHNUitPJ4zDILE4tC8eZsZBdMoADxwEKNuGOthFpQg4slsBlyEWUDIaBGuUwdCgrwwcphCtarx1AEl0GNOQAlTAgahQMl-SlrDbcRmnAFwC4YFF3W0TZUBoMksMYCNR7n-PmMI5en0+tqdHMchph7GMMD5wuTakJ45J85MtM3DOPLPumtdQN1xgtyPRnkAtBAsuQ6GVyvV7qj4P10w4idR9uJs4pnvp+4D55D1e50Obpvb6az2rlxdL5d+rrtzv71NHzOnl+lyHYAAmABmACANwIggA

💻 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

  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 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

Recevez les nouvelles issues par e-mail

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