diff --git a/convert.go b/convert.go index abf15cd..22d273b 100644 --- a/convert.go +++ b/convert.go @@ -679,17 +679,24 @@ func (ts *Typescript) buildStruct(obj types.Object, st *types.Struct) (*bindings // Use the json name if present jsonTag, err := tags.Get("json") if err == nil { - if jsonTag.Name == "-" { + if jsonTag.Name == "-" && len(jsonTag.Options) == 1 { // Completely ignore this field. + // The tag `"-,"` names the field as "-". continue } // Empty tags are ignored. if jsonTag.Name != "" { tsField.Name = jsonTag.Name } - if len(jsonTag.Options) > 0 && jsonTag.Options[0] == "omitempty" { + if len(jsonTag.Options) > 0 && (jsonTag.Options[0] == "omitempty" || jsonTag.Options[0] == "omitzero") { tsField.QuestionToken = true } + + if strings.Contains(tsField.Name, "-") { + // Unsure how else to handle this. Name with a hyphen in them + // are not valid field names, so we need to wrap them in quotes. + tsField.Name = fmt.Sprintf("%q", tsField.Name) + } } // Infer the type. diff --git a/testdata/tags/tags.go b/testdata/tags/tags.go new file mode 100644 index 0000000..bd9b4e0 --- /dev/null +++ b/testdata/tags/tags.go @@ -0,0 +1,14 @@ +package tags + +type Tags struct { + NoTag int `json:"no_tag"` + OmitEmpty int `json:"omit_empty,omitempty"` + OnlyOmitEmpty int `json:",omitempty"` + Ignore int `json:"-"` + // Hypen appears in JSON as key "-" + // See https://pkg.go.dev/encoding/json@master#Marshal + // https://go.dev/play/p/vsW07aIi_Pj + Hyphen int `json:"-,"` + OmitZero int `json:"omit_zero,omitzero"` + OnlyOmitZero int `json:",omitzero"` +} diff --git a/testdata/tags/tags.ts b/testdata/tags/tags.ts new file mode 100644 index 0000000..15603da --- /dev/null +++ b/testdata/tags/tags.ts @@ -0,0 +1,11 @@ +// Code generated by 'guts'. DO NOT EDIT. + +// From tags/tags.go +export interface Tags { + readonly no_tag: number; + readonly omit_empty?: number; + readonly OnlyOmitEmpty?: number; + readonly "-": number; + readonly omit_zero?: number; + readonly OnlyOmitZero?: number; +}