3 ms·
Then that means we have to define the interface twice: once in TypeScript and another in Zod?
by ngrilly 1y ago
Then that means we have to define the interface twice: once in TypeScript and another in Zod?
- kentonv 1y agoNo. Zod gives you TypeScript types corresponding to the schema. So you would only need to write the schema in Zod. (I do wish it could be the other way, though: Write only TypeScript, get runtime checks automatically.)
- ngrilly 1y agoI'm familiar with zod.infer but I'm not sure how to use it to produce an interface that would be compatible with RpcStub and RpcTarget, like MyApi in the example in your post: // Shared interface declaration: interface MyApi { hello(name: string): Promise<string>; } // On the client: let api: RpcStub<MyApi> = newWebSocketRpcSession("wss://example.com/api"); // On the server: class MyApiServer extends RpcTarget implements MyApi { hello(name) { return `Hello, ${name}!` } }
- kentonv 1y agoI'll be honest and say I haven't tried it myself. But my expectation is you'd use Zod to define all your parameter types. Then you'd define your RpcTarget in plain TypeScript, but for the parameters on each method, reference the Zod-derived types.
- sebws 1y agoThere are ways if you're ok with a build step, e.g. https://typia.io/ https://typia.io/ or https://github.com/GoogleFeud/ts-runtime-checks https://github.com/GoogleFeud/ts-runtime-checks Although perhaps that's not what you mean. I found these through this https://github.com/moltar/typescript-runtime-type-benchmarks https://github.com/moltar/typescript-runtime-type-benchmarks