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' import type * as vue from 'vue'
interface ErrorMessageSlotProps { interface ErrorMessageSlotProps {

View File

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

View File

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