v3-component-props.d.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { Data } 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. // prettier-ignore
  40. type InferPropType<T> = T extends null
  41. ? any // null & true would fail to infer
  42. : T extends { type: null | true }
  43. ? 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`
  44. : T extends ObjectConstructor | { type: ObjectConstructor }
  45. ? Record<string, any>
  46. : T extends BooleanConstructor | { type: BooleanConstructor }
  47. ? boolean
  48. : T extends DateConstructor | { type: DateConstructor}
  49. ? Date
  50. : T extends FunctionConstructor
  51. ? Function
  52. : T extends Prop<infer V, infer D>
  53. ? unknown extends V
  54. ? D extends null | undefined
  55. ? V
  56. : D
  57. : ExtractCorrectPropType<V>
  58. : T
  59. export type ExtractPropTypes<O> = {
  60. // use `keyof Pick<O, RequiredKeys<O>>` instead of `RequiredKeys<O>` to support IDE features
  61. [K in keyof Pick<O, RequiredKeys<O>>]: InferPropType<O[K]>
  62. } & {
  63. // use `keyof Pick<O, OptionalKeys<O>>` instead of `OptionalKeys<O>` to support IDE features
  64. [K in keyof Pick<O, OptionalKeys<O>>]?: InferPropType<O[K]>
  65. }
  66. type DefaultKeys<T> = {
  67. [K in keyof T]: T[K] extends
  68. | {
  69. default: any
  70. }
  71. | BooleanConstructor
  72. | { type: BooleanConstructor }
  73. ? T[K] extends {
  74. type: BooleanConstructor
  75. required: true
  76. }
  77. ? never
  78. : K
  79. : never
  80. }[keyof T]
  81. // extract props which defined with default from prop options
  82. export type ExtractDefaultPropTypes<O> = O extends object
  83. ? // use `keyof Pick<O, DefaultKeys<O>>` instead of `DefaultKeys<O>` to support IDE features
  84. { [K in keyof Pick<O, DefaultKeys<O>>]: InferPropType<O[K]> }
  85. : {}