fix(types/tsx): optional props from Mixin/Extends are treated as required (#2048)

This commit is contained in:
wonderful-panda
2020-09-16 23:09:35 +09:00
committed by GitHub
parent 7e68ddd354
commit 89e9ab8a2a
6 changed files with 133 additions and 46 deletions

View File

@@ -63,18 +63,15 @@ type PropMethod<T, TConstructor = any> = T extends (...args: any) => any // if i
? { new (): TConstructor; (): T; readonly prototype: TConstructor } // Create Function like constructor
: never
type RequiredKeys<T, MakeDefaultRequired> = {
[K in keyof T]: T[K] extends
| { required: true }
| (MakeDefaultRequired extends true ? { default: any } : never)
? K
: never
type RequiredKeys<T> = {
[K in keyof T]: T[K] extends { required: true } | { default: any } ? K : never
}[keyof T]
type OptionalKeys<T, MakeDefaultRequired> = Exclude<
keyof T,
RequiredKeys<T, MakeDefaultRequired>
>
type OptionalKeys<T> = Exclude<keyof T, RequiredKeys<T>>
type DefaultKeys<T> = {
[K in keyof T]: T[K] extends { default: any } ? K : never
}[keyof T]
type InferPropType<T> = T extends null
? any // null & true would fail to infer
@@ -86,12 +83,9 @@ type InferPropType<T> = T extends null
? boolean
: T extends Prop<infer V, infer D> ? (unknown extends V ? D : V) : T
export type ExtractPropTypes<
O,
MakeDefaultRequired extends boolean = true
> = O extends object
? { [K in RequiredKeys<O, MakeDefaultRequired>]: InferPropType<O[K]> } &
{ [K in OptionalKeys<O, MakeDefaultRequired>]?: InferPropType<O[K]> }
export type ExtractPropTypes<O> = O extends object
? { [K in RequiredKeys<O>]: InferPropType<O[K]> } &
{ [K in OptionalKeys<O>]?: InferPropType<O[K]> }
: { [K in string]: any }
const enum BooleanFlags {
@@ -99,6 +93,11 @@ const enum BooleanFlags {
shouldCastTrue
}
// extract props which defined with default from prop options
export type ExtractDefaultPropTypes<O> = O extends object
? { [K in DefaultKeys<O>]: InferPropType<O[K]> }
: {}
type NormalizedProp =
| null
| (PropOptions & {