v3-component-props.d.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { Data, IfAny } from './common'
  2. export type ComponentPropsOptions<P = Data> =
  3. | ComponentObjectPropsOptions<P>
  4. | string[]
  5. export type ComponentObjectPropsOptions<P = Data> = {
  6. [K in keyof P]: Prop<P[K]> | null
  7. }
  8. export type Prop<T, D = T> = PropOptions<T, D> | PropType<T>
  9. type DefaultFactory<T> = () => T | null | undefined
  10. export interface PropOptions<T = any, D = T> {
  11. type?: PropType<T> | true | null
  12. required?: boolean
  13. default?: D | DefaultFactory<D> | null | undefined | object
  14. validator?(value: unknown): boolean
  15. }
  16. export type PropType<T> = PropConstructor<T> | PropConstructor<T>[]
  17. type PropConstructor<T> =
  18. | { (): T }
  19. | { new (...args: never[]): T & object }
  20. | { new (...args: string[]): Function }
  21. type RequiredKeys<T> = {
  22. [K in keyof T]: T[K] extends
  23. | { required: true }
  24. | { default: any }
  25. | BooleanConstructor
  26. | { type: BooleanConstructor }
  27. ? K
  28. : never
  29. }[keyof T]
  30. type OptionalKeys<T> = Exclude<keyof T, RequiredKeys<T>>
  31. type ExtractFunctionPropType<
  32. T extends Function,
  33. TArgs extends Array<any> = any[],
  34. TResult = any
  35. > = T extends (...args: TArgs) => TResult ? T : never
  36. type ExtractCorrectPropType<T> = T extends Function
  37. ? ExtractFunctionPropType<T>
  38. : Exclude<T, Function>
  39. type InferPropType<T> = [T] extends [null]
  40. ? any // null & true would fail to infer
  41. : [T] extends [{ type: null | true }]
  42. ? any // As TS issue https://github.com/Microsoft/TypeScript/issues/14829 // somehow `ObjectConstructor` when inferred from { (): T } becomes `any` // `BooleanConstructor` when inferred from PropConstructor(with PropMethod) becomes `Boolean`
  43. : [T] extends [ObjectConstructor | { type: ObjectConstructor }]
  44. ? Record<string, any>
  45. : [T] extends [BooleanConstructor | { type: BooleanConstructor }]
  46. ? boolean
  47. : [T] extends [DateConstructor | { type: DateConstructor }]
  48. ? Date
  49. : [T] extends [(infer U)[] | { type: (infer U)[] }]
  50. ? U extends DateConstructor
  51. ? Date | InferPropType<U>
  52. : InferPropType<U>
  53. : [T] extends [Prop<infer V, infer D>]
  54. ? unknown extends V
  55. ? IfAny<V, V, D>
  56. : V
  57. : T
  58. export type ExtractPropTypes<O> = {
  59. // use `keyof Pick<O, RequiredKeys<O>>` instead of `RequiredKeys<O>` to support IDE features
  60. [K in keyof Pick<O, RequiredKeys<O>>]: InferPropType<O[K]>
  61. } & {
  62. // use `keyof Pick<O, OptionalKeys<O>>` instead of `OptionalKeys<O>` to support IDE features
  63. [K in keyof Pick<O, OptionalKeys<O>>]?: InferPropType<O[K]>
  64. }
  65. type DefaultKeys<T> = {
  66. [K in keyof T]: T[K] extends
  67. | {
  68. default: any
  69. }
  70. | BooleanConstructor
  71. | { type: BooleanConstructor }
  72. ? T[K] extends {
  73. type: BooleanConstructor
  74. required: true
  75. }
  76. ? never
  77. : K
  78. : never
  79. }[keyof T]
  80. // extract props which defined with default from prop options
  81. export type ExtractDefaultPropTypes<O> = O extends object
  82. ? // use `keyof Pick<O, DefaultKeys<O>>` instead of `DefaultKeys<O>` to support IDE features
  83. { [K in keyof Pick<O, DefaultKeys<O>>]: InferPropType<O[K]> }
  84. : {}