microsoft / microsoft/TypeScript

JS ES6 class derived member functions typed with literals don't get assigned the correct type

Ouverte
#44,640 8 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

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

Description

Bug Report

In rare cases (such as when literals are used in a type constraint), ES6 class overridden functions will cause strange issues when returning said literals from the derived function.

🔎 Search Terms

ts es6 class derived

🕗 Version & Regression Information
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about ES6 classes
⏯ Playground Link

Playground link with relevant code

💻 Code
class Base
{
    test()
    {
        if (Math.random() > 0.5)
            return 5;

        return false;
    }
}

class Derived extends Base
{
    // error here: for some reason, Derived::test() is typed as "() => boolean"
    // even though the literal false is being returned, and as such it says it can't
    // match Base::test
    test()
    {
        return false;
    }
}

🙁 Actual behavior

The derived function's auto-typing assumes it is the literals' actual type, such as number or boolean, instead of the literals themselves. Derived::test, if not overridden, is typed as () => false, which should match () => 5 | false, but because it's typed as boolean instead it breaks (this only seems to happen if we're overriding a base member function)

🙂 Expected behavior

The derived function should be able to match if the typing is handled as normal.

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 la reproduction liée dans TypeScript Playground et comparez les types inférés pour Base::test et Derived::test. Suivez la manière dont les méthodes ES6 redéfinies infèrent des types de retour littéraux, puis vérifiez que la fonction dérivée est acceptée par rapport à l’union littérale de la classe de base sans perdre les types littéraux.

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é
Clairement spécifiée
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

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