Skip to content

Instantly share code, notes, and snippets.

@phryneas
Created December 23, 2024 08:48
Show Gist options
  • Save phryneas/7b89c0f211a3e7cc1394d70e8c3d6c94 to your computer and use it in GitHub Desktop.
Save phryneas/7b89c0f211a3e7cc1394d70e8c3d6c94 to your computer and use it in GitHub Desktop.
TS: Higher Kinded Types
// Higher Kinded base type
// inspired by
// https://github.com/arktypeio/arktype/blob/main/ark/util/hkt.ts
// and
// https://github.com/gvergnaud/hotscript/blob/main/src/internals/core/Core.ts
declare const rawArgs: unique symbol;
type rawArgs = typeof rawArgs;
interface Hkt {
[rawArgs]: unknown;
args: this[rawArgs] extends infer args extends unknown[] ? args : never;
arg0: this[rawArgs] extends [infer arg, ...any] ? arg : never;
arg1: this[rawArgs] extends [any, infer arg, ...any] ? arg : never;
return: unknown;
}
type Apply<fn extends Hkt, args> = (fn & {
[rawArgs]: args;
})["return"];
/** example: Capitalize a string */
interface Cap extends Hkt {
return: string extends this["arg0"]
? `${Uppercase<string>}${string}`
: this["arg0"] extends `${infer C}${infer Rest}`
? `${Uppercase<C>}${Rest}`
: never;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment