Skip to content

Instantly share code, notes, and snippets.

@pveyes
Last active October 17, 2020 03:34
Show Gist options
  • Save pveyes/12da7713a475394802e7743930759bf6 to your computer and use it in GitHub Desktop.
Save pveyes/12da7713a475394802e7743930759bf6 to your computer and use it in GitHub Desktop.
type AppendArgument<Fn, A> = Fn extends (...args: infer Args) => infer R
? (...args: [...Args, A]) => R
: never
type TheActualCurry<T,R> = T extends [infer F, ...infer S]
? (...args: [F]) => TheActualCurry<S,R>
: R
declare function Currying<T extends readonly any[], R>(fn: (...args: [...T]) => R): TheActualCurry<T,R>
type DeepReadonly<T extends Record<string, any>> = {
readonly [k in keyof T]: T[k] extends number | boolean | string | Function
? T[k]
: DeepReadonly<T[k]>
}
type MyExclude<T, U> = T extends U ? never : T
type First<T extends any[]> = T[0] extends undefined ? never : T[0]
type If<C, T, F> = C extends boolean ? C extends true ? T : F : never
type Last<T extends any[]> = T extends [...infer _, infer L] ? L : never
type Length<T extends readonly any[]> = T["length"]
type WithType<T> = {
type: T
}
type LookUp<U, T> = U extends WithType<T> ? U : never
type MyOmit<T, K extends keyof T> = {
[k in Exclude<keyof T, K>]: T[k]
}
type MyPick<T, K extends keyof T> = {
[k in K]: T[k]
}
type Pop<T extends any[]> = T extends [...infer A, any] ? A : never
// not finished, failed on case 3
type ResolvePromise<T> = T extends Promise<infer U> ? U : T
type ResolvePromises<T> = { -readonly[P in keyof T]: ResolvePromise<T[P]> }
declare function PromiseAll<T extends readonly any[]>(values: T): Promise<ResolvePromises<T>>
type MyReadonly<T> = {
readonly [k in keyof T]: T[k]
}
type MyReturnType<T> = T extends (...args: any[]) => infer U ? U : any
type TupleToObject<T extends readonly any[]> = {
[k in T[number]]: k
}
type TupleToUnion<T extends readonly any[]> = T[number]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment