microsoft / microsoft/TypeScript
JS ES6 class derived member functions typed with literals don't get assigned the correct type
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
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
- 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 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