Skip to content

Commit

Permalink
better handle edge cases for nested arrays and slices
Browse files Browse the repository at this point in the history
  • Loading branch information
pbnjay committed Jan 4, 2025
1 parent bf6867f commit c0f22a7
Showing 1 changed file with 21 additions and 8 deletions.
29 changes: 21 additions & 8 deletions v2/internal/typescriptify/typescriptify.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,18 +276,27 @@ func (t *typeScriptClassBuilder) AddMapField(fieldName string, field reflect.Str
keyType := field.Type.Key()
valueType := field.Type.Elem()
valueTypeName := nameTypeOf(valueType)
valueTypeSuffix := ""
if valueType.Kind() == reflect.Ptr {
valueType = valueType.Elem()
valueTypeName = nameTypeOf(valueType)
}
if name, ok := t.types[valueType.Kind()]; ok {
valueTypeName = name
}
if valueType.Kind() == reflect.Array || valueType.Kind() == reflect.Slice {
valueTypeName = nameTypeOf(valueType.Elem()) + "[]"
arrayDepth := 1
for valueType.Elem().Kind() == reflect.Array || valueType.Elem().Kind() == reflect.Slice {
valueType = valueType.Elem()
arrayDepth++
}
valueType = valueType.Elem()
valueTypeName = nameTypeOf(valueType)
valueTypeSuffix = strings.Repeat("[]", arrayDepth)
}
if valueType.Kind() == reflect.Ptr {
valueTypeName = nameTypeOf(valueType.Elem())
valueType = valueType.Elem()
valueTypeName = nameTypeOf(valueType)
}
if name, ok := t.types[valueType.Kind()]; ok {
valueTypeName = name
}
if valueType.Kind() == reflect.Map {
// TODO: support nested maps
Expand Down Expand Up @@ -316,10 +325,10 @@ func (t *typeScriptClassBuilder) AddMapField(fieldName string, field reflect.Str
fieldName = fmt.Sprintf(`"%s"?`, strippedFieldName)
}
}
t.fields = append(t.fields, fmt.Sprintf("%s%s: Record<%s, %s>;", t.indent, fieldName, keyTypeStr, valueTypeName))
t.fields = append(t.fields, fmt.Sprintf("%s%s: Record<%s, %s>;", t.indent, fieldName, keyTypeStr, valueTypeName+valueTypeSuffix))
if valueType.Kind() == reflect.Struct {
t.constructorBody = append(t.constructorBody, fmt.Sprintf("%s%sthis%s = this.convertValues(source[\"%s\"], %s, true);",
t.indent, t.indent, dotField, strippedFieldName, t.prefix+valueTypeName+t.suffix))
t.indent, t.indent, dotField, strippedFieldName, t.prefix+valueTypeName+valueTypeSuffix+t.suffix))
} else {
t.constructorBody = append(t.constructorBody, fmt.Sprintf("%s%sthis%s = source[\"%s\"];",
t.indent, t.indent, dotField, strippedFieldName))
Expand Down Expand Up @@ -740,11 +749,15 @@ func (t *TypeScriptify) convertType(depth int, typeOf reflect.Type, customCode m
}

arrayDepth := 1
for field.Type.Elem().Kind() == reflect.Slice { // Slice of slices:
for field.Type.Elem().Kind() == reflect.Slice || field.Type.Elem().Kind() == reflect.Array { // Slice of slices:
field.Type = field.Type.Elem()
arrayDepth++
}

if field.Type.Elem().Kind() == reflect.Ptr { // extract ptr type
field.Type = field.Type.Elem()
}

if field.Type.Elem().Kind() == reflect.Struct { // Slice of structs:
t.logf(depth, "- struct slice %s.%s (%s)", typeOf.Name(), field.Name, field.Type.String())
typeScriptChunk, err := t.convertType(depth+1, field.Type.Elem(), customCode)
Expand Down

0 comments on commit c0f22a7

Please sign in to comment.