microsoft / microsoft/TypeScript
Generic derived value type
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
Hey guys.
I can not see if I'm doing anything wrong here. I am expecting to be able to get exact type from generic type ...
Is this just limitation of typescript or i am doing anything whrong here?
TypeScript Version: 3.1.3
Search Terms:
Generic derived value type
Code
export type filterTypeName = 'price' | 'price_range';
export type priceFilterValue = {
from: number;
to: number;
};
export type priceRangeFilterValue = {
fromRange: number;
toRange: number;
};
export type filterValueType<T extends filterTypeName> =
T extends 'price' ? priceFilterValue
: T extends 'price_range' ? priceRangeFilterValue : never;
type productFilterParameters<T extends filterTypeName> = {
filter: T;
value: filterValueType<T>;
};
function addProductFilter<T extends filterTypeName>(params: productFilterParameters<T>) {
switch (params.filter) {
case 'price':
const priceFrom = params.value.from; //Property 'from' does not exist on type 'filterValueType<T>'
break;
default:
break;
}
}
// parameter value is derivered based on filter type... not working id function definition
addProductFilter({ filter: 'price', value: { from: 1, to: 2 } });
//expected behavior something like this
type productFilterParametersCorrect = {
filter: 'price';
value: priceFilterValue;
} | {
filter: 'price_range';
value: priceRangeFilterValue;
}
function addProductFilterCorrect(params: productFilterParametersCorrect) {
switch (params.filter) {
case 'price':
const priceFrom = params.value.from; // correct
break;
case 'price_range':
const priceRangeFrom = params.value.fromRange; // correct
default:
break;
}
}
Expected behavior:
Code
const value: priceFilterValue
Actual behavior:
Code
const value: filterValueType<T>
Playground Link:
Playground
Related Issues:
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 le Playground lié et par l’exemple générique addProductFilter utilisant TypeScript 3.1.3, puis comparez le comportement du paramètre générique avec l’union définie explicitement. C’est terminé lorsque le switch sur params.filter fournit les propriétés de valeur correspondantes sans l’erreur signalée ; le payload ne mentionne aucun fichier ni test du dépôt.
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
- 35/100