microsoft / microsoft/TypeScript
negating type constraints
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
Sometimes it's useful to put a limit on what a type parameter can be. In a way it is a counterpart of the extends constraint.
Problem
Consider an example, a classic function that takes whatever and returns void:
function ignore<a>(value: a) : void {};
However we must not apply this function to Promises, because it might get us a temporal leak if we do.
function readFileAsync(): Promise<string>;
ignore(readFileAsync()); // <-- untracked promise, temporal leak
Unfortunately it is way too easy to get into a situation when a promise is passed to that function unintentionally as a result of refactoring:
// before
function readFileSync(): string;
ignore(readFileSync()); // typechecks, works as intended, no problem
// after refactoring
function readFileAsync(): Promise<string>; // <-- went async here
ignore(readFileAsync()); // typechecks, unintended temporal leak, big problem
Solution
The situation above could have been avoided if TypeScript allowed negating constraints:
function ignore<a unlike Promise<any>>(value: a): void {} // <-- hypothetical syntax
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 syntaxe unlike proposée et par la comparaison de l’issue avec les contraintes extends existantes. Examinez le comportement de TypeScript concernant les contraintes génériques et la vérification des types, puis définissez comment l’exclusion de Promise<any> devrait fonctionner dans les cas de refactorisation présentés ; le travail n’est considéré comme terminé qu’avec un design approuvé, ainsi qu’une implémentation et des tests, puisque aucun fichier ni point d’entrée de test n’est indiqué.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript
- Domaine
- compilers
- Type d'issue
- Fonctionnalité
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100