All quizzesHard
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.