@@ -8,12 +8,12 @@ import (
88)
99
1010// writeByteSliceCreation handles the creation of []byte slices with proper Uint8Array handling
11- func (c * GoToTSCompiler ) writeByteSliceCreation (lengthArg , capacityArg interface {} ) error {
11+ func (c * GoToTSCompiler ) writeByteSliceCreation (lengthArg , capacityArg any ) error {
1212 return c .writeSliceCreationForType (lengthArg , capacityArg , true )
1313}
1414
1515// writeSliceCreationForType handles slice creation with special handling for byte slices
16- func (c * GoToTSCompiler ) writeSliceCreationForType (lengthArg , capacityArg interface {} , isByteSlice bool ) error {
16+ func (c * GoToTSCompiler ) writeSliceCreationForType (lengthArg , capacityArg any , isByteSlice bool ) error {
1717 hasCapacity := capacityArg != nil
1818
1919 if isByteSlice && ! hasCapacity {
@@ -52,7 +52,7 @@ func (c *GoToTSCompiler) writeSliceCreationForType(lengthArg, capacityArg interf
5252}
5353
5454// writeGenericSliceCreation handles the creation of generic slices with proper type hints
55- func (c * GoToTSCompiler ) writeGenericSliceCreation (elemType types.Type , lengthArg , capacityArg interface {} ) error {
55+ func (c * GoToTSCompiler ) writeGenericSliceCreation (elemType types.Type , lengthArg , capacityArg any ) error {
5656 hasCapacity := capacityArg != nil
5757
5858 c .tsw .WriteLiterally ("$.makeSlice<" )
@@ -90,7 +90,7 @@ func (c *GoToTSCompiler) writeSliceTypeHint(elemType types.Type, hasCapacity boo
9090}
9191
9292// writeExprOrDefault writes an expression if it's not nil, otherwise writes a default value
93- func (c * GoToTSCompiler ) writeExprOrDefault (expr interface {} , defaultValue string ) error {
93+ func (c * GoToTSCompiler ) writeExprOrDefault (expr any , defaultValue string ) error {
9494 if expr == nil {
9595 c .tsw .WriteLiterally (defaultValue )
9696 return nil
@@ -149,6 +149,14 @@ func (c *GoToTSCompiler) writeReflectTypeFor(exp *ast.CallExpr, selectorExpr *as
149149 typeArg := instance .TypeArgs .At (0 )
150150 // fmt.Printf("DEBUG: Type argument: %v\n", typeArg)
151151
152+ if named , ok := typeArg .(* types.Named ); ok {
153+ if _ , isInterface := named .Underlying ().(* types.Interface ); isInterface {
154+ typeName := qualifiedTypeName (named )
155+ c .tsw .WriteLiterally ("reflect.getInterfaceLiteralTypeByName(\" " + typeName + "\" )" )
156+ return true , nil
157+ }
158+ }
159+
152160 // Generate TypeScript code to create a Type for this type
153161 if err := c .writeTypeForTypeArg (typeArg ); err != nil {
154162 return true , err
@@ -157,6 +165,54 @@ func (c *GoToTSCompiler) writeReflectTypeFor(exp *ast.CallExpr, selectorExpr *as
157165 return true , nil
158166}
159167
168+ // writeReflectTypeAssert handles reflect.TypeAssert[T](v) calls.
169+ func (c * GoToTSCompiler ) writeReflectTypeAssert (exp * ast.CallExpr , selectorExpr * ast.SelectorExpr ) (handled bool , err error ) {
170+ if selectorExpr .Sel .Name != "TypeAssert" {
171+ return false , nil
172+ }
173+
174+ xIdent , ok := selectorExpr .X .(* ast.Ident )
175+ if ! ok {
176+ return false , nil
177+ }
178+
179+ obj := c .objectOfIdent (xIdent )
180+ if obj == nil {
181+ return false , nil
182+ }
183+
184+ pkgName , ok := obj .(* types.PkgName )
185+ if ! ok || pkgName .Imported ().Path () != "reflect" {
186+ return false , nil
187+ }
188+
189+ if len (exp .Args ) != 1 {
190+ return false , errors .New ("reflect.TypeAssert called with unexpected argument count" )
191+ }
192+
193+ if c .pkg .TypesInfo .Instances == nil {
194+ return false , errors .New ("reflect.TypeAssert called but no type instances available" )
195+ }
196+
197+ instance , hasInstance := c .pkg .TypesInfo .Instances [selectorExpr .Sel ]
198+ if ! hasInstance || instance .TypeArgs == nil || instance .TypeArgs .Len () == 0 {
199+ return false , errors .New ("reflect.TypeAssert called without type arguments" )
200+ }
201+
202+ typeArg := instance .TypeArgs .At (0 )
203+
204+ c .tsw .WriteLiterally ("$.typeAssertTuple<" )
205+ c .WriteGoType (typeArg , GoTypeContextGeneral )
206+ c .tsw .WriteLiterally (">(" )
207+ if err := c .WriteValueExpr (exp .Args [0 ]); err != nil {
208+ return true , err
209+ }
210+ c .tsw .WriteLiterally (".Interface(), " )
211+ c .writeTypeInfoObject (typeArg )
212+ c .tsw .WriteLiterally (")" )
213+ return true , nil
214+ }
215+
160216// writeTypeForTypeArg generates TypeScript code to create a reflect.Type for the given Go type
161217func (c * GoToTSCompiler ) writeTypeForTypeArg (t types.Type ) error {
162218 // Handle basic types
@@ -175,12 +231,46 @@ func (c *GoToTSCompiler) writeTypeForTypeArg(t types.Type) error {
175231 c .tsw .WriteLiterally (")" )
176232 return nil
177233 case * types.Slice :
178- // For slice types, use TypeOf with an empty slice
179- c .tsw .WriteLiterally ("reflect.TypeOf([])" )
234+ c .tsw .WriteLiterally ("reflect.SliceOf(" )
235+ if err := c .writeTypeForTypeArg (underlying .Elem ()); err != nil {
236+ return err
237+ }
238+ c .tsw .WriteLiterally (")" )
180239 return nil
181240 case * types.Array :
182- // For array types, use TypeOf with an empty array
183- c .tsw .WriteLiterally ("reflect.TypeOf([])" )
241+ c .tsw .WriteLiterally ("reflect.ArrayOf(" )
242+ c .tsw .WriteLiterallyf ("%d, " , underlying .Len ())
243+ if err := c .writeTypeForTypeArg (underlying .Elem ()); err != nil {
244+ return err
245+ }
246+ c .tsw .WriteLiterally (")" )
247+ return nil
248+ case * types.Map :
249+ c .tsw .WriteLiterally ("reflect.MapOf(" )
250+ if err := c .writeTypeForTypeArg (underlying .Key ()); err != nil {
251+ return err
252+ }
253+ c .tsw .WriteLiterally (", " )
254+ if err := c .writeTypeForTypeArg (underlying .Elem ()); err != nil {
255+ return err
256+ }
257+ c .tsw .WriteLiterally (")" )
258+ return nil
259+ case * types.Chan :
260+ c .tsw .WriteLiterally ("reflect.ChanOf(" )
261+ switch underlying .Dir () {
262+ case types .RecvOnly :
263+ c .tsw .WriteLiterally ("reflect.RecvDir" )
264+ case types .SendOnly :
265+ c .tsw .WriteLiterally ("reflect.SendDir" )
266+ default :
267+ c .tsw .WriteLiterally ("reflect.BothDir" )
268+ }
269+ c .tsw .WriteLiterally (", " )
270+ if err := c .writeTypeForTypeArg (underlying .Elem ()); err != nil {
271+ return err
272+ }
273+ c .tsw .WriteLiterally (")" )
184274 return nil
185275 case * types.Struct :
186276 // For struct types, use TypeOf with zero value
0 commit comments