koSakano/type-challenges

213 - Vue Basic Props

Opened this issue · 0 comments

type ComputedType<C> = { [P in keyof C]:  C[P] extends () => infer R ? R : never }

type PropsType<P> = {
  [K in keyof P]: P[K] extends {}
    ? 'type' extends keyof P[K]
      ? PropsTypeType<P[K]['type']>
      : PropsTypeType<P[K]>
    : PropsTypeType<P[K]>
}

type PropsTypeType<T> = T extends Array<any> ?  ExtractType<T[number]> : ExtractType<T>

type ExtractType<T> = T extends (...args: any) => infer R ? R : T extends new (...args: any) => infer R2 ? R2 : any

type Options<P, D, C, M> = {
  props: P
  data: (this: PropsType<P>) => D
  computed: C & ThisType<D & ComputedType<C> & M & PropsType<P>>
  methods: M & ThisType<D & ComputedType<C> & M & PropsType<P>>
}

declare function VueBasicProps<P, D, C, M>(options: Options<P, D, C, M>): any