microsoft / microsoft/TypeScript
Narrowing empty string or false in generic misbehaves
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
🔎 Search Terms
generic, narrowing, empty string, false, falsy
🕗 Version & Regression Information
This is the behavior in every version I tried, but it seems to behave a little worse with TS v4.2.3 and prior.
⏯ Playground Link
💻 Code
function func1<T extends number | null | undefined | false | ''>(x: number | T) {
return x || undefined;
}
function func2<T extends number | null | undefined | false | ''>(x: number | T) {
return x ? x > 0 ? x : -x : x;
}
function func3<T extends number | null | undefined | false | ''>(x: number | T) {
return x ? Math.abs(x) : x;
}
const x: number | undefined = func1('');
const y = func2(-3);
const z = func3(-3);
🙁 Actual behavior
The inferred return type of func1 can contain false or '' depending on T. It's wrong because x || undefined can never result in false or '' and thus should not be in the resulting type.
func2 fails type checking: Operator '>' cannot be applied to types 'number | NonNullable<T>' and 'number'.. It's wrong because the truthiness check should narrow x to number. (Note that func3 succeeds type checking because the signature of Math.abs seems to provide supplemental information which narrows x to number.)
🙂 Expected behavior
The inferred return type of func1 is should number | undefined, regardless of T.
func2 is expected to pass type checking, x having been narrowed to number with the truthiness check.
Additional information about the issue
All functions act 'correctly' if defined without the use of generics, but it's inadequate because the return type of func2 and func3 would always be number | null | undefined | false | '' regardless of argument type.
My actual use case is creating functions that transform numeric inputs and propagate falsy values. I've worked around this issue using type assertions in spots where narrowing misbehaves.
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 l’exemple TypeScript Playground lié et reproduisez le comportement dans func1, func2 et func3 en utilisant les versions de compilateur indiquées. Suivez la vérification des types et le rétrécissement du flux de contrôle pour les paramètres génériques lors des tests de vérité ; c’est terminé lorsque func1 exclut false et '', tandis que func2 passe la vérification des types avec x rétréci à number.
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é
- Plutôt claire
- Accessibilité débutants
- 42/100