Ver código fonte

types(runtime-core): improve the extracted instance types (#1936)

HcySunYang 5 anos atrás
pai
commit
955450f539

+ 2 - 1
packages/runtime-core/src/apiDefineComponent.ts

@@ -189,7 +189,8 @@ export function defineComponent<
     Extends,
     Extends,
     E,
     E,
     VNodeProps & AllowedComponentProps & ComponentCustomProps
     VNodeProps & AllowedComponentProps & ComponentCustomProps
-  >
+  > &
+    Readonly<ExtractPropTypes<PropsOptions>>
 > &
 > &
   ComponentOptionsWithObjectProps<
   ComponentOptionsWithObjectProps<
     PropsOptions,
     PropsOptions,

+ 56 - 1
test-dts/defineComponent.test-d.tsx

@@ -94,7 +94,7 @@ describe('with object props', () => {
       // default + function
       // default + function
       ffff: {
       ffff: {
         type: Function as PropType<(a: number, b: string) => { a: boolean }>,
         type: Function as PropType<(a: number, b: string) => { a: boolean }>,
-        default: (a: number, b: string) => ({ a: true })
+        default: (a: number, b: string) => ({ a: a > +b })
       },
       },
       validated: {
       validated: {
         type: String,
         type: String,
@@ -799,3 +799,58 @@ describe('componentOptions setup should be `SetupContext`', () => {
     ctx: SetupContext
     ctx: SetupContext
   ) => any)
   ) => any)
 })
 })
+
+describe('extract instance type', () => {
+  const Base = defineComponent({
+    props: {
+      baseA: {
+        type: Number,
+        default: 1
+      }
+    }
+  })
+  const MixinA = defineComponent({
+    props: {
+      mA: {
+        type: String,
+        default: ''
+      }
+    }
+  })
+  const CompA = defineComponent({
+    extends: Base,
+    mixins: [MixinA],
+    props: {
+      a: {
+        type: Boolean,
+        default: false
+      },
+      b: {
+        type: String,
+        required: true
+      },
+      c: Number
+    }
+  })
+
+  const compA = {} as InstanceType<typeof CompA>
+
+  expectType<boolean>(compA.a)
+  expectType<string>(compA.b)
+  expectType<number | undefined>(compA.c)
+  // mixins
+  expectType<string>(compA.mA)
+  // extends
+  expectType<number>(compA.baseA)
+
+  //  @ts-expect-error
+  expectError((compA.a = true))
+  //  @ts-expect-error
+  expectError((compA.b = 'foo'))
+  //  @ts-expect-error
+  expectError((compA.c = 1))
+  //  @ts-expect-error
+  expectError((compA.mA = 'foo'))
+  //  @ts-expect-error
+  expectError((compA.baseA = 1))
+})