microsoft / microsoft/TypeScript
ThisType would disturb Generics' inferring type when assign an expression to a type variable
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
TypeScript Version: 3.9.2, and it does exist in 'Nightly' version, too.
Search Terms: ThisType, Generics, Inferring problem
Code
type customFunc = (...args: any) => any
declare function SimpleVue<
D,
C extends { [K in string]: customFunc },
M = { [K in string]: customFunc },
CC = { [K in keyof C]: ReturnType<C[K]> },
ReturnedD = D extends customFunc ? ReturnType<D> : never,
>(option: {
data: D,
methods: M,
computed: C
} & ThisType<M & ReturnedD & CC>): ReturnedD
const instance = SimpleVue({
data() {
return {
firstname: 'Type',
lastname: 'Challenges',
amount: 10,
}
},
computed: {
fullname() {
return this.firstname + ' ' + this.lastname
}
},
methods: {
hi() {
alert(this.fullname.toLowerCase())
}
}
});
Expected behavior:
We expect ReturnedD = D extends customFunc ? ReturnType<D> : never infers ReturnedD to ReturnType<D> at runtime since D fits the shape of customFunc:
() => {
firstname: string;
lastname: string;
amount: number;
}
And the code should show no error in TypeScript environment.
Actual behavior:
The actual behavior is that ReturnedD is inferred to never type since D extends customFunc here is false at runtime.
You can also check it with the returned type of instance as well.
Playground Link:
Check out the link here.
Personal speculation:
If you look at the demo above, you can do following steps to remove the error hint and confirm ReturnedD's correction:
- Remove
ReturnedDfromThisType<M & ReturnedD & CC>; - Save the file;
- Error disappeared on
this.firstname, etc; - The returned type of
instanceinferred from TypeScript is as expected and would not benever;
I also reproduced it with TypeScript playground.
We can confirm that:
ReturnedDruns well in inferring type at runtime;- The wrong type may be caused by some mechanism inside
ThisType;
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 dans le playground de TypeScript 3.9.2 et comparez l’inférence avec et sans ReturnedD dans ThisType<M & ReturnedD & CC>. Suivez l’effet de ThisType sur le type conditionnel D extends customFunc ? ReturnType : never. Le travail est terminé lorsque l’exemple ne signale aucune erreur et que l’instance n’infère plus ReturnedD comme never.
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