Type-Level Computation

Preview — 3 of 10 questions

TypeScript doesn't natively support HKTs, but what does this pattern simulate?

javascript
// Encoding HKT via an interface map:
interface URItoKind<A> {
  'Array': A[];
  'Maybe': A | null;
  'Promise': Promise<A>;
}

type URIS = keyof URItoKind<unknown>;

type Kind<F extends URIS, A> = URItoKind<A>[F];

// Generic functor:
function map<F extends URIS, A, B>(
  fa: Kind<F, A>,
  f: (a: A) => B,
  // ... this needs a concrete implementation per F
): Kind<F, B> {
  throw "not implemented";
}

// Usage:
type ArrOfNums  = Kind<'Array',   number>; // ?
type MaybeStr   = Kind<'Maybe',   string>; // ?
type PromiseBool = Kind<'Promise', boolean>; // ?
ACompile error — TypeScript doesn't support this pattern
BAll three are unknown
CArrOfNums = unknown[], MaybeStr = string, PromiseBool = boolean
DArrOfNums = number[], MaybeStr = string | null, PromiseBool = Promise<boolean>

What does this type produce?

javascript
type DeepKeys<T, Prefix extends string = ''> =
  T extends object
    ? {
        [K in keyof T & string]:
          | `${Prefix}${K}`
          | DeepKeys<T[K], `${Prefix}${K}.`>
      }[keyof T & string]
    : never;

interface Config {
  server: { host: string; port: number };
  db: { url: string; pool: { max: number } };
}

type Keys = DeepKeys<Config>;
A"server" | "db"
B"server.host" | "server.port" | "db.url" | "db.pool.max" — leaf keys only
C"server" | "server.host" | "server.port" | "db" | "db.url" | "db.pool" | "db.pool.max"
Dstring

What is the result of this type-level addition?

javascript
// Build a tuple of length N:
type BuildTuple<N extends number, T extends unknown[] = []> =
  T['length'] extends N ? T : BuildTuple<N, [...T, unknown]>;

// Add two numbers at the type level:
type Add<A extends number, B extends number> =
  [...BuildTuple<A>, ...BuildTuple<B>]['length'];

type Five = Add<2, 3>;
type Ten  = Add<4, 6>;
ACompile error — arithmetic is not possible in TypeScript types
BFive = number, Ten = number
CFive = "5", Ten = "10"
DFive = 5, Ten = 10

Sign up free to play

Answer all 10 questions (7 more), see explanations for every answer, and track your score.