type-challenge 更新

109 阅读2分钟

00005-extreme-readonly-keys

type GetReadonlyKeys<T> = {
   [K in keyof Required<T>]: Equal<{ [F in K]: T[F] }, { -readonly [F in K]: T[F] }> extends true ? never : K
 }[keyof T]

00006-hard-simple-vue

这道题用ThisType就特别方便,传送门:TypeScript: Documentation - Utility Types (typescriptlang.org)

function SimpleVue<
  D extends () => any,
  M extends Record<string, any>,
  C extends Record<string, any>,
>(options: Options<D, M, C>): any

type Options<
  D extends () => any,
  M extends Record<string, any>,
  C extends Record<string, any>,
> = {
  data: D & ThisType<ReturnType<D> & Computed<C> & M>
  computed: C & ThisType<ReturnType<D> & Computed<C> & M>
  methods: M & ThisType<ReturnType<D> & Computed<C> & M>
}

type Computed<C extends Record<string, any>> = {
  [key in keyof C]: ReturnType<C[key]>
}

00007-easy-readonly

type MyReadonly<T> = { +readonly [key in keyof T]: T[key] }

00008-medium-readonly-2

type MyReadonly2<T, K extends keyof T = keyof T> =
{ [key in Exclude<keyof T, K | GetReadonlyKeys<T>>]: T[key] } &
{ +readonly [key in K]: T[key] } &
{ +readonly [key in GetReadonlyKeys<T>]: T[key] }

00009-medium-deep-readonly

type DeepReadonly<T> = { +readonly [key in keyof T]: Transverse<T[key]> }

type AnyFunc = (...args: any[]) => any

type Transverse<T> = T extends Record<string, any> ? T extends AnyFunc ? T : DeepReadonly<T> : T

00010-medium-tuple-to-unions

type TupleToUnion<T> = T extends (infer R)[] ? R : never

00011-easy-tuple-to-object

type TupleToObject<T extends readonly any[]> = T extends readonly (infer R)[] ? { [key in R]: key } : never

00012-easy-tuple-to-object

type TupleToObject<T extends readonly any[]> = T extends readonly (infer R)[] ? { [key in R]: key } : never

00012-medium-chainable-options

type Chainable<P = undefined> = {
  option<T extends string, V = undefined>(
    key: T,
    value: V
  ): Chainable<
    V extends undefined
      ? undefined
      : ProcessValue<P extends undefined ? undefined : Omit<P, T>> & {
        [key in T]: V
      }
  > &
  ProcessValue<V extends undefined ? P : undefined>

  get(): P
}

type ProcessValue<V = undefined> = V extends undefined
  ? { [key in never]: never }
  : V

00013-warm-hello-world

额,还以为看错了,这题

type HelloWorld = string // expected to be a string

00014-easy-first

type First<T extends any[]> = T extends [infer R, ...any[]] ? R : never

00015-medium-last

type Last<T extends any[]> = T extends [...args:any[], infer R] ? R : never

00016-medium-pop

type Pop<T extends any[]> = T extends [...infer R, infer L] ? R : []

00017-hard-currying-1

这题貌似有问题

type Return<T extends (...args: any) => any> = T extends (
  ...args: [infer R, ...infer O]
) => infer TR
  ? (
      arg: R
    ) => O extends []
      ? TR
      : Return<(...args: O) => (TR)>
  : never

00018-easy-tuple-length

type Length<T> = T extends { length: infer R } ? R : never

00020-medium-promise-all

这道题其实就是把Array类型重新排列,然后再处理值

declare function PromiseAll< T extends readonly unknown[] | []>(values: T): { -readonly [P in keyof T]: Awaited<T[P]>; }

00043-easy-exclude

type MyExclude<T, U> = T extends U ? never : T

00055-hard-union-to-intersection

这题是真不会

type UnionToIntersection<U> = (U extends infer R ? (x: R) => any : never) extends (x: infer V) => any ? V : never

00057-hard-get-required

type GetRequired<T> = { [P in keyof T as T[P] extends Required<T>[P] ? P : never]: T[P] }

持续更新中...