Show HN: Zero-codegen, no-compile TypeScript type inference from Protobufs

https://news.ycombinator.com/rss Hits: 18
Summary

Zero-codegen, no-compile TypeScript type inference from protobuf message s. protobuf-ts-types lets you define language-agnostic message types in proto format, then infers TypeScript types from them with no additional codegen. Try on github.dev | View on CodeSandbox Warning Proof of concept, not production ready. See Limitations below for more details. How it Works In short, aggressive use of TypeScript's template literal types. Annotated example from the source: // Pass the proto string you want to infer `message` names from as a generic parameter type MessageNames < Proto extends string > = // Infer `message` parts using template literal type WrapWithNewlines < Proto > extends `${ string } ${ Whitespace } message${ Whitespace } ${infer MessageName } ${ OptionalWhitespace } {${ string } }${infer Rest } ` ? // Recursively infer remaining message names [ MessageName , ... MessageNames < Rest > ] : [ ] ; See more in src/proto.ts . Usage First, install the package. npm install https://github.com/nathanhleung/protobuf-ts-types Then, use it in TypeScript. import { pbt } from "protobuf-ts-types" ; const proto = ` syntax = "proto3"; message Person { string name = 1; int32 id = 2; bool is_ceo = 3; optional string description = 4; } message Group { string name = 1; repeated Person people = 2; } ` ; // `Proto` is a mapping of message names to message types, inferred from the // `proto` source string above. type Proto = pbt . infer < typeof proto > ; type Person = Proto [ "Person" ] ; type Person2 = pbt . infer < typeof proto , "Person" > ; // `Person` and `Person2` are the same type: // ``` // { // name: string; // id: number; // is_ceo: boolean; // description?: string; // } // ``` type Group = pbt . infer < typeof proto , "Group" > ; function greetPerson ( person : Person ) { console . log ( `Hello, ${ person . name } !` ) ; if ( person . description ) { console . log ( ` ${ person . description } ` ) ; } else { console . log ( "(no description)" ) ; } } function greetGroup ...

First seen: 2025-04-14 17:05

Last seen: 2025-04-15 11:08