typescript / expert
Snippet
Defunctionalizing Higher-Kinded Types with Mapped Key Invariant Lookup Tables
Emulates Higher-Kinded Types (HKTs) in TypeScript using lightweight defunctionalization techniques without requiring native type-level generic constructors.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface HKT {readonly _F: unknown;readonly _A: unknown;readonly result: unknown;}interface ArrayHKT extends HKT {readonly result: Array<this["_A"]>;}interface PromiseHKT extends HKT {readonly result: Promise<this["_A"]>;}type Apply<F extends HKT, A> = (F & { readonly _A: A })["result"];type ArrayOfNumbers = Apply<ArrayHKT, number>;type PromiseOfString = Apply<PromiseHKT, string>;
Breakdown
1
interface HKT { readonly _F: unknown; readonly _A: unknown; readonly result: unknown; }
Base interface defining generic type holes _A and output slot result.
2
interface ArrayHKT extends HKT { readonly result: Array<this["_A"]>; }
Concrete HKT binding the result slot to Array type containing target _A.
3
type Apply<F extends HKT, A> = (F & { readonly _A: A })["result"];
Applies argument type A to HKT definition F and extracts the computed result field.