]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(types): fix `defineComponent` inference to `Component` (#5949)
authorCarlos Rodrigues <carlos@hypermob.co.uk>
Wed, 18 May 2022 23:34:35 +0000 (00:34 +0100)
committerGitHub <noreply@github.com>
Wed, 18 May 2022 23:34:35 +0000 (19:34 -0400)
packages/runtime-core/src/apiDefineComponent.ts
test-dts/defineComponent.test-d.tsx
test-dts/index.d.ts

index f0f69af34f65e73302cd767c2468d333704cf9d5..a086704762a7a5b67de4407a37c496e28ca4d44f 100644 (file)
@@ -111,7 +111,29 @@ export function defineComponent<
   E extends EmitsOptions = EmitsOptions,
   EE extends string = string,
   Provide extends ComponentProvideOptions = ComponentProvideOptions,
-  Options extends {} = {}
+  Options extends ComponentOptionsWithoutProps<
+    Props,
+    RawBindings,
+    D,
+    C,
+    M,
+    Mixin,
+    Extends,
+    E,
+    EE,
+    Provide
+  > = ComponentOptionsWithoutProps<
+    Props,
+    RawBindings,
+    D,
+    C,
+    M,
+    Mixin,
+    Extends,
+    E,
+    EE,
+    Provide
+  >
 >(
   options: Options &
     ComponentOptionsWithoutProps<
@@ -154,7 +176,29 @@ export function defineComponent<
   E extends EmitsOptions = Record<string, any>,
   EE extends string = string,
   Provide extends ComponentProvideOptions = ComponentProvideOptions,
-  Options extends {} = {}
+  Options extends ComponentOptionsWithArrayProps<
+    PropNames,
+    RawBindings,
+    D,
+    C,
+    M,
+    Mixin,
+    Extends,
+    E,
+    EE,
+    Provide
+  > = ComponentOptionsWithArrayProps<
+    PropNames,
+    RawBindings,
+    D,
+    C,
+    M,
+    Mixin,
+    Extends,
+    E,
+    EE,
+    Provide
+  >
 >(
   options: Options &
     ComponentOptionsWithArrayProps<
@@ -198,7 +242,29 @@ export function defineComponent<
   E extends EmitsOptions = Record<string, any>,
   EE extends string = string,
   Provide extends ComponentProvideOptions = ComponentProvideOptions,
-  Options extends {} = {}
+  Options extends ComponentOptionsWithObjectProps<
+    PropsOptions,
+    RawBindings,
+    D,
+    C,
+    M,
+    Mixin,
+    Extends,
+    E,
+    EE,
+    Provide
+  > = ComponentOptionsWithObjectProps<
+    PropsOptions,
+    RawBindings,
+    D,
+    C,
+    M,
+    Mixin,
+    Extends,
+    E,
+    EE,
+    Provide
+  >
 >(
   options: Options &
     ComponentOptionsWithObjectProps<
index 3c4e9cb39363ed403e557e95eefb0353c8f2647d..7412d6db36f1377622ea04a71e25bd009e771a96 100644 (file)
@@ -1,5 +1,6 @@
 import {
   describe,
+  test,
   Component,
   defineComponent,
   PropType,
@@ -1045,7 +1046,7 @@ describe('emits', () => {
 })
 
 describe('componentOptions setup should be `SetupContext`', () => {
-  expect<ComponentOptions['setup']>(
+  expectType<ComponentOptions['setup']>(
     {} as (props: Record<string, any>, ctx: SetupContext) => any
   )
 })
@@ -1141,6 +1142,20 @@ describe('async setup', () => {
   vm.a = 2
 })
 
+// #5948
+describe('DefineComponent should infer correct types when assigning to Component', () => {
+  let component: Component
+  component = defineComponent({
+    setup(_, { attrs, slots }) {
+      // @ts-expect-error should not be any
+      expectType<[]>(attrs)
+      // @ts-expect-error should not be any
+      expectType<[]>(slots)
+    }
+  })
+  expectType<Component>(component)
+})
+
 // check if defineComponent can be exported
 export default {
   // function components
index d0eeb6a7b65b3e77647b3b2fb2273b0dfe8b884c..0662a6447e6a9218f64b8cd3e4030430a38c4f8b 100644 (file)
@@ -4,6 +4,7 @@
 export * from '@vue/runtime-dom'
 
 export function describe(_name: string, _fn: () => void): void
+export function test(_name: string, _fn: () => any): void
 
 export function expectType<T>(value: T): void
 export function expectError<T>(value: T): void
@@ -15,4 +16,4 @@ export type IsUnion<T, U extends T = T> = (
   ? false
   : true
 
-export type IsAny<T> = 0 extends (1 & T) ? true : false
+export type IsAny<T> = 0 extends 1 & T ? true : false