This commit is contained in:
Tycho 2025-06-19 14:14:53 +08:00 committed by GitHub
commit a8dd43cba4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 2 deletions

View File

@ -1870,6 +1870,25 @@ defineComponent({
},
})
describe('object props w/ PropType<boolean>', () => {
const MyComponent = defineComponent({
props: {
b1: { type: [Boolean] as PropType<boolean> },
b2: {
type: [Boolean, String] as PropType<boolean | string>,
required: true,
},
},
setup(props) {
expectType<boolean>(props.b1)
expectType<boolean | string>(props.b2)
},
})
expectType<JSX.Element>(<MyComponent b1 b2 />)
// @ts-expect-error
;<MyComponent />
})
import type * as vue from 'vue'
interface ErrorMessageSlotProps {

View File

@ -1,4 +1,5 @@
import {
type PropType,
type Ref,
type Slots,
type VNode,
@ -269,11 +270,17 @@ describe('defineProps w/ runtime declaration', () => {
type: Array,
required: true,
},
b1: Boolean as PropType<boolean>,
b2: Boolean as PropType<any>,
b3: Number as PropType<number>,
})
expectType<{
foo?: string
bar: number
baz: unknown[]
b1: boolean
b2?: any
b3?: number
}>(props)
props.foo && props.foo + 'bar'

View File

@ -90,7 +90,9 @@ type RequiredKeys<T> = {
? T[K] extends { default: undefined | (() => undefined) }
? never
: K
: never
: T[K] extends PropType<infer B> | { type: PropType<infer B> }
? IfAny<B, never, B extends boolean ? K : never>
: never
}[keyof T]
type OptionalKeys<T> = Exclude<keyof T, RequiredKeys<T>>
@ -104,7 +106,11 @@ type DefaultKeys<T> = {
? T[K] extends { type: BooleanConstructor; required: true } // not default if Boolean is marked as required
? never
: K
: never
: T[K] extends
| PropType<infer B>
| { type: PropType<infer B>; required?: false }
? IfAny<B, never, B extends boolean ? K : never>
: never
}[keyof T]
type InferPropType<T, NullAsAny = true> = [T] extends [null]