Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
hijiangtao opened this issue Jul 31, 2020 · 0 comments
Labels
Needs Investigation This issue needs a team member to investigate its status.
Milestone

Comments

@hijiangtao
Copy link

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;
@RyanCavanaugh RyanCavanaugh added the Needs Investigation This issue needs a team member to investigate its status. label Aug 25, 2020
@RyanCavanaugh RyanCavanaugh added this to the Backlog milestone Aug 25, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Needs Investigation This issue needs a team member to investigate its status.
Projects
None yet
Development

No branches or pull requests

2 participants