diff --git a/packages/dts-test/setupHelpers.test-d.ts b/packages/dts-test/setupHelpers.test-d.ts index feb4085dea0..283ffcd0b57 100644 --- a/packages/dts-test/setupHelpers.test-d.ts +++ b/packages/dts-test/setupHelpers.test-d.ts @@ -8,7 +8,8 @@ import { defineSlots, VNode, Ref, - defineModel + defineModel, + PropType } from 'vue' import { describe, expectType } from './utils' import { defineComponent } from 'vue' @@ -40,6 +41,22 @@ describe('defineProps w/ generics', () => { test() }) +// #9277 +describe('defineProps w/ generic object type', () => { + type Props = { + modelValue: T + } + + const props = defineProps({ + modelValue: { + type: Object as PropType['modelValue']>, + required: true + } + }) + + expectType(props.modelValue) +}) + describe('defineProps w/ type declaration + withDefaults', () => { const res = withDefaults( defineProps<{ diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index 4d402789555..3e913b93d37 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -21,8 +21,7 @@ import { EMPTY_ARR, def, extend, - isOn, - IfAny + isOn } from '@vue/shared' import { warn } from './warning' import { @@ -122,10 +121,20 @@ type InferPropType = [T] extends [null] ? U extends DateConstructor ? Date | InferPropType : InferPropType - : [T] extends [Prop] - ? unknown extends V - ? IfAny - : V + : [T] extends [{ type: infer U; default: infer D }] + ? [T] extends [PropOptions] + ? V + : D + : [T] extends [{ type: infer U }] + ? [T] extends [PropOptions] + ? V + : U + : [T] extends [{ default: infer U }] + ? [T] extends [PropOptions] + ? D + : U + : [T] extends [PropType] + ? V : T /**