diff --git a/07-type-mapping/main.ts b/07-type-mapping/main.ts index c1ac3cd..f6fc7fc 100644 --- a/07-type-mapping/main.ts +++ b/07-type-mapping/main.ts @@ -1,34 +1,34 @@ enum OpCode { - PING, - HELLO, - MOVE, + PING, + HELLO, + MOVE, } type HelloEvent = { - name: string; + name: string; }; type MoveEvent = { - x: number; - y: number; + x: number; + y: number; }; type OpArgsMapping = { - [OpCode.PING]: null; - [OpCode.HELLO]: HelloEvent; - [OpCode.MOVE]: MoveEvent; + [OpCode.PING]: {}; + [OpCode.HELLO]: HelloEvent; + [OpCode.MOVE]: MoveEvent; }; class WebSocketClient { - public op( - op: TOp, - args: TArgs, - ) { - // ... - } + public op( + op: TOp, + args: TArgs, + ) { + // ... + } } -function main() { - const client = new WebSocketClient(); - client.op(OpCode.HELLO, { name: "foo" }); +function main_ws() { + const client = new WebSocketClient(); + client.op(OpCode.PING, {}); } diff --git a/08-type-programming/main.ts b/08-type-programming/main.ts new file mode 100644 index 0000000..a057bdf --- /dev/null +++ b/08-type-programming/main.ts @@ -0,0 +1,13 @@ +type ParseUrlParams = Url extends `${infer Start}/${infer Rest}` + ? ParseUrlParams & ParseUrlParams + : Url extends `{${infer Param}}` + ? { [P in Param]: string } + : {}; + +function navigate

(path: P, params: ParseUrlParams

) { + // ... +} + +function main() { + navigate("/foo/bar", { foo: "asd" }); +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..3aa456b --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Type Level Programming + +## Sources + +- https://www.emoses.org/posts/resolver-resolved-pattern/ +- https://farazdagi.com/posts/2024-04-07-typestate-pattern/ +- https://youtu.be/_ccDqRTx-JU +- https://type-level-typescript.com/