Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/oneofone/struct2ts
Generate Typescript classes/interfaces out of Go structs
https://github.com/oneofone/struct2ts
class es6 generator golang struct typescript
Last synced: about 3 hours ago
JSON representation
Generate Typescript classes/interfaces out of Go structs
- Host: GitHub
- URL: https://github.com/oneofone/struct2ts
- Owner: OneOfOne
- Created: 2018-05-12T04:07:48.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2021-08-07T21:44:38.000Z (over 3 years ago)
- Last Synced: 2024-11-17T15:08:44.039Z (3 days ago)
- Topics: class, es6, generator, golang, struct, typescript
- Language: Go
- Homepage:
- Size: 75.2 KB
- Stars: 141
- Watchers: 7
- Forks: 15
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# struct2ts [![GoDoc](https://godoc.org/github.com/OneOfOne/struct2ts?status.svg)](https://godoc.org/github.com/OneOfOne/struct2ts)
An extremely simple and powerful Go struct to Typescript Class generator.
Inspired by [tkrajina/typescriptify-golang-structs](https://github.com/tkrajina/typescriptify-golang-structs).
## Install
go get -u -v github.com/OneOfOne/struct2ts/...
## Features
* Fairly decent command line interface if you don't wanna write a generator yourself.
* Automatically handles Go `int64` timestamps `<->` Javascript `Date`.
* Automatically handles json tags.## Options
### There's an extra struct tag to control the output, `ts`, valid options are
* `-` omit this field.
* `date` handle converting `time.Time{}.Unix() <-> javascript Date`.
* `,no-null` only valid for struct fields, forces creating a new class rather than using `null` in TS.
* `,null` allows any field type to be `null`.## Example
* Input:
```go
type OtherStruct struct {
T time.Time `json:"t,omitempty"`
}type ComplexStruct struct {
S string `json:"s,omitempty"`
I int `json:"i,omitempty"`
F float64 `json:"f,omitempty"`
TS *int64 `json:"ts,omitempty" ts:"date,null"`
T time.Time `json:"t,omitempty"` // automatically handled
NullOther *OtherStruct `json:"o,omitempty"`
NoNullOther *OtherStruct `json:"nno,omitempty" ts:",no-null"`
}
```* Output:
```ts
// ... helpers...
// struct2ts:github.com/OneOfOne/struct2ts_test.ComplexStructOtherStruct
class ComplexStructOtherStruct {
t: Date;constructor(data?: any) {
const d: any = (data && typeof data === 'object') ? ToObject(data) : {};
this.t = ('t' in d) ? ParseDate(d.t) : new Date();
}toObject(): any {
const cfg: any = {};
cfg.t = 'string';
return ToObject(this, cfg);
}
}// struct2ts:github.com/OneOfOne/struct2ts_test.ComplexStruct
class ComplexStruct {
s: string;
i: number;
f: number;
ts: Date | null;
t: Date;
o: ComplexStructOtherStruct | null;
nno: ComplexStructOtherStruct;constructor(data?: any) {
const d: any = (data && typeof data === 'object') ? ToObject(data) : {};
this.s = ('s' in d) ? d.s as string : '';
this.i = ('i' in d) ? d.i as number : 0;
this.f = ('f' in d) ? d.f as number : 0;
this.ts = ('ts' in d) ? ParseDate(d.ts) : null;
this.t = ('t' in d) ? ParseDate(d.t) : new Date();
this.o = ('o' in d) ? new ComplexStructOtherStruct(d.o) : null;
this.nno = new ComplexStructOtherStruct(d.nno);
}toObject(): any {
const cfg: any = {};
cfg.i = 'number';
cfg.f = 'number';
cfg.t = 'string';
return ToObject(this, cfg);
}
}
// ...exports...```
## Command Line Usage
```
➤ struct2ts -h
usage: struct2ts [] [...]Flags:
-h, --help Show context-sensitive help (also try --help-long
and --help-man).
--indent="\t" Output indentation.
-m, --mark-optional-fields Add `?` to fields with omitempty.
-6, --es6 generate es6 code
-C, --no-ctor Don't generate a ctor.
-T, --no-toObject Don't generate a Class.toObject() method.
-E, --no-exports Don't automatically export the generated types.
-D, --no-date Don't automatically handle time.Unix () <-> JS
Date().
-H, --no-helpers Don't output the helpers.
-N, --no-default-values Don't assign default/zero values in the ctor.
-i, --interface Only generate an interface (disables all the other
options).
-s, --src-only Only output the Go code (helpful if you want to
edit it yourself).
-p, --package-name="main" the package name to use if --src-only is set.
-k, --keep-temp Keep the generated Go file, ignored if --src-only
is set.
-o, --out="-" Write the output to a file instead of stdout.
-V, --version Show application version.Args:
[] List of structs to convert (github.com/you/auth/users.User,
users.User or users.User:AliasUser).```
## Advanced
### Custom output per model
```golang
type CustomTypescript interface {
RenderCustomTypescript(w io.Writer) (err error)
}
```
If your model implements a ```RenderCustomTypescript(w io.Writer) (err error)``` function it will inject what ever you
write to the writer at the end of the model. struct2ts will handle the first level of indenting for you.## TODO
* Use [xast](https://github.com/OneOfOne/xast) to skip reflection.
* Support annoymous structs.
* ~~Support ES6.~~## License
This project is released under the [BSD 3-clause "New" or "Revised" License](https://github.com/golang/go/blob/master/LICENSE).