Skip to content

fix(types): fix method-based emits with props #13004

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

Closed
wants to merge 1 commit into from
Closed

fix(types): fix method-based emits with props #13004

wants to merge 1 commit into from

Conversation

g-plane
Copy link
Contributor

@g-plane g-plane commented Apr 20, 2023

What kind of change does this PR introduce? (check at least one)

  • Bugfix
  • Feature
  • Code style update
  • Refactor
  • Build-related changes
  • Other, please describe:

Does this PR introduce a breaking change? (check one)

  • Yes
  • No

If yes, please describe the impact and migration path for existing applications:

The PR fulfills these requirements:

If adding a new feature, the PR's description includes:

  • A convincing reason for adding this feature (to avoid wasting your time, it's best to open a suggestion issue first and wait for approval before working on it)

Other information:

In v2.7 (for now I'm using, it's 2.7.14), when using defineComponent with props, method-based emits and setup like the code snippet below:

defineComponent({
  props: {
    foo: Number
  },
  emits: {
    'update:foo'(value: number) {}
  },
  setup(_, { emit }) {
    emit('update:foo', 123) // OK
    emit('update:foo', '123') // expect error, but passed
    emit('bar') // expect error, but passed
  }
})

the second and the third emit call in setup won't raise any TypeScript type-check errors.

However, if I change emits to using arrow functions like this:

defineComponent({
  props: {
    foo: Number
  },
  emits: {
-   'update:foo'(value: number) {}
+   'update:foo': (value: number) => {}
  },
  setup(_, { emit }) {
    emit('update:foo', 123) // OK
    emit('update:foo', '123') // error is raised as expected
    emit('bar') // error is raised as expected
  }
})

This PR fixes this by removing the Props generic from ComponentOptionsWithProps. In Overload 3 of defineComponent, props is always defined so there's no need to check if props is defined or not by using HasDefined type, then we inlined ExtractPropTypes<PropsOptions> (the default type of the removed Props generic).

@g-plane g-plane closed this Dec 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant