Skip to content

Commit 2ab87ae

Browse files
committed
Better handle Array/Map responses in /types/js
1 parent 67fb997 commit 2ab87ae

2 files changed

Lines changed: 31 additions & 11 deletions

File tree

src/ServiceStack/NativeTypes/TypeScript/CommonJsGenerator.cs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public class CommonJsGenerator : ILangGenerator
3737

3838
public TypeScriptGenerator Gen { get; set; }
3939

40+
public Func<string, string> ReturnTypeFilter { get; set; } = type => type;
41+
4042
public string Type(string type, string[] genericArgs)
4143
{
4244
var typeName = Gen.Type(type, genericArgs);
@@ -188,12 +190,15 @@ public string GetCode(MetadataTypes metadata, IRequest request, INativeTypesMeta
188190
if (operation?.ReturnsVoid == true)
189191
return nameof(IReturnVoid);
190192
if (operation?.ReturnType != null)
191-
return Gen.Type("IReturn`1", new[]
193+
{
194+
var returnType = Gen.Type("IReturn`1", new[]
192195
{
193196
TypeScriptGenerator.ReturnTypeAliases.TryGetValue(operation.ReturnType.Name, out var returnTypeAlias)
194197
? returnTypeAlias
195198
: Type(operation.ReturnType.Name, operation.ReturnType.GenericArgs)
196199
});
200+
return returnType;
201+
}
197202
return response != null
198203
? Gen.Type("IReturn`1", new[] { Gen.Type(response.Name, response.GenericArgs) })
199204
: null;
@@ -323,15 +328,7 @@ private string AppendType(ref StringBuilderWrapper sb, MetadataType type, string
323328
var types = implStr.RightPart('<');
324329
var returnType = types.Substring(0, types.Length - 1);
325330

326-
// This is to avoid invalid syntax such as "return new string()"
327-
TypeScriptGenerator.primitiveDefaultValues.TryGetValue(returnType, out var replaceReturnType);
328-
329-
if (returnType == "any")
330-
replaceReturnType = "{}";
331-
else if (returnType.EndsWith("[]"))
332-
replaceReturnType = $"new Array<{returnType.Substring(0, returnType.Length -2)}>()";
333-
334-
var responseName = replaceReturnType ?? $"new {returnType}()";
331+
var responseName = GetReturnType(returnType);
335332
responseTypeExpression = typeName + ".prototype.createResponse = function () { return " + responseName + "; };";
336333
}
337334
else if (implStr == "IReturnVoid")
@@ -357,6 +354,26 @@ private string AppendType(ref StringBuilderWrapper sb, MetadataType type, string
357354
return lastNS;
358355
}
359356

357+
// Used in createResponse(){ return ... }
358+
// Needs to be typed erased
359+
private string GetReturnType(string originalReturnType)
360+
{
361+
var returnType = ReturnTypeFilter(originalReturnType);
362+
363+
// This is to avoid invalid syntax such as "return new string()"
364+
TypeScriptGenerator.primitiveDefaultValues.TryGetValue(returnType, out var replaceReturnType);
365+
366+
if (returnType == "any")
367+
replaceReturnType = "{}";
368+
else if (returnType.EndsWith("[]"))
369+
replaceReturnType = "[]";
370+
else if (returnType.StartsWith("{")) // { [name:K]: V }
371+
replaceReturnType = "{}";
372+
373+
var responseName = replaceReturnType ?? $"new {returnType}()";
374+
return responseName;
375+
}
376+
360377
public static string CreateEmptyClass(string name) => "var " + name + @" = /** @class */ (function () {
361378
function " + name + @"() {
362379
}

src/ServiceStack/NativeTypes/TypeScript/TypeScriptGenerator.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,10 @@ public string Type(string type, string[] genericArgs)
788788
if (args.Length > 0)
789789
args.Append(", ");
790790

791-
args.Append(GenericArg(arg));
791+
if (arg.StartsWith("{")) // { [name:T]: T }
792+
args.Append(arg);
793+
else
794+
args.Append(GenericArg(arg));
792795
}
793796

794797
var typeName = TypeAlias(type);

0 commit comments

Comments
 (0)