: never
type RequiredKeys<T> = {
- [K in keyof T]: T[K] extends { required: true } | { default: any } ? K : never
+ [K in keyof T]: T[K] extends
+ | { required: true }
+ | { default: any }
+ // don't mark Boolean props as undefined
+ | BooleanConstructor
+ | { type: BooleanConstructor }
+ ? K
+ : never
}[keyof T]
type OptionalKeys<T> = Exclude<keyof T, RequiredKeys<T>>
type DefaultKeys<T> = {
- [K in keyof T]: T[K] extends { default: any } ? K : never
+ [K in keyof T]: T[K] extends
+ | { default: any }
+ // Boolean implicitly defaults to false
+ | BooleanConstructor
+ | { type: BooleanConstructor }
+ ? T[K] extends { type: BooleanConstructor; required: true } // not default if Boolean is marked as required
+ ? never
+ : K
+ : never
}[keyof T]
type InferPropType<T> = T extends null
a?: number | undefined
b: string
e?: Function
+ h: boolean
bb: string
bbb: string
cc?: string[] | undefined
required: true
},
e: Function,
+ h: Boolean,
// default value should infer type and make it non-void
bb: {
default: 'hello'
expectType<ExpectedProps['a']>(props.a)
expectType<ExpectedProps['b']>(props.b)
expectType<ExpectedProps['e']>(props.e)
+ expectType<ExpectedProps['h']>(props.h)
expectType<ExpectedProps['bb']>(props.bb)
expectType<ExpectedProps['bbb']>(props.bbb)
expectType<ExpectedProps['cc']>(props.cc)
expectType<ExpectedProps['a']>(props.a)
expectType<ExpectedProps['b']>(props.b)
expectType<ExpectedProps['e']>(props.e)
+ expectType<ExpectedProps['h']>(props.h)
expectType<ExpectedProps['bb']>(props.bb)
expectType<ExpectedProps['cc']>(props.cc)
expectType<ExpectedProps['dd']>(props.dd)
expectType<ExpectedProps['a']>(this.a)
expectType<ExpectedProps['b']>(this.b)
expectType<ExpectedProps['e']>(this.e)
+ expectType<ExpectedProps['h']>(this.h)
expectType<ExpectedProps['bb']>(this.bb)
expectType<ExpectedProps['cc']>(this.cc)
expectType<ExpectedProps['dd']>(this.dd)
h(MyComponent, {})
})
+
+// #2338
+describe('Boolean prop implicit false', () => {
+ const MyComponent = defineComponent({
+ props: {
+ visible: Boolean
+ }
+ })
+
+ h(MyComponent, {})
+
+ const RequiredComponent = defineComponent({
+ props: {
+ visible: {
+ type: Boolean,
+ required: true
+ }
+ }
+ })
+
+ h(RequiredComponent, {
+ visible: true
+ })
+ // @ts-expect-error
+ expectError(h(RequiredComponent, {}))
+})