Просмотр исходного кода

fix(type): fix prop type infer (#4530)

fix #4525
fishDog 4 лет назад
Родитель
Сommit
4178d5d7d9

+ 4 - 4
packages/runtime-core/src/componentProps.ts

@@ -109,10 +109,10 @@ type InferPropType<T> = [T] extends [null]
   ? boolean
   : [T] extends [DateConstructor | { type: DateConstructor }]
   ? Date
-  : [T] extends [
-      (DateConstructor | infer U)[] | { type: (DateConstructor | infer U)[] }
-    ]
-  ? Date | InferPropType<U>
+  : [T] extends [(infer U)[] | { type: (infer U)[] }]
+  ? U extends DateConstructor
+    ? Date | InferPropType<U>
+    : InferPropType<U>
   : [T] extends [Prop<infer V, infer D>]
   ? unknown extends V
     ? D

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

@@ -44,6 +44,7 @@ describe('with object props', () => {
     date?: Date
     l?: Date
     ll?: Date | number
+    lll?: string | number
   }
 
   type GT = string & { __brand: unknown }
@@ -135,7 +136,8 @@ describe('with object props', () => {
       },
       date: Date,
       l: [Date],
-      ll: [Date, Number]
+      ll: [Date, Number],
+      lll: [String, Number]
     },
     setup(props) {
       // type assertion. See https://github.com/SamVerschueren/tsd
@@ -170,6 +172,7 @@ describe('with object props', () => {
       expectType<ExpectedProps['date']>(props.date)
       expectType<ExpectedProps['l']>(props.l)
       expectType<ExpectedProps['ll']>(props.ll)
+      expectType<ExpectedProps['lll']>(props.lll)
 
       // @ts-expect-error props should be readonly
       expectError((props.a = 1))