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] }
持续更新中...