TypeScript
Beginner
1 min read
Recursive and Self-Referential Type Aliases
Example
// Recursive JSON type
type JSONPrimitive = string | number | boolean | null;
type JSONObject = { [key: string]: JSONValue };
type JSONArray = JSONValue[];
type JSONValue = JSONPrimitive | JSONObject | JSONArray;
const data: JSONValue = {
name: "Alice",
scores: [98, 87, 76],
address: { city: "London", zip: "EC1A 1BB" },
active: true,
};
// Recursive tree structure
type TreeNode<T> = {
value: T;
children: TreeNode<T>[];
};
function sumTree(node: TreeNode<number>): number {
return node.value + node.children.reduce(
(acc, child) => acc + sumTree(child),
0
);
}
const tree: TreeNode<number> = {
value: 1,
children: [
{ value: 2, children: [{ value: 4, children: [] }] },
{ value: 3, children: [] },
],
};
console.log(sumTree(tree)); // 10
// Recursive readonly deep type
type DeepReadonly<T> = T extends (infer U)[]
? readonly DeepReadonly<U>[]
: T extends object
? { readonly [K in keyof T]: DeepReadonly<T[K]> }
: T;
type Config = { server: { host: string; port: number }; debug: boolean };
type FrozenConfig = DeepReadonly<Config>;
Related Resources
TypeScript Reference
Complete tag & property list
TypeScript How-To Guides
Step-by-step practical guides
TypeScript Exercises
Practice what you've learned
More in TypeScript