microsoft / microsoft/TypeScript

ThisType would disturb Generics' inferring type when assign an expression to a type variable

Ouverte
#39,848 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Needs Investigation
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:

  1. Remove ReturnedD from ThisType<M & ReturnedD & CC>;
  2. Save the file;
  3. Error disappeared on this.firstname, etc;
  4. The returned type of instance inferred from TypeScript is as expected and would not be never;

I also reproduced it with TypeScript playground.

We can confirm that:

  1. ReturnedD runs well in inferring type at runtime;
  2. The wrong type may be caused by some mechanism inside ThisType;

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. 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

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.