ServiceStack - 为某些 类 强制生成 Typescript 类型

ServiceStack - Force generation of Typescript types for certain classes

我正在使用一个主要专注于 ServiceStack API 和与之交互的 Typescript 前端(带有 ServiceStack JsonServiceClient)的后端。这是一个大型项目,因此扩展能力非常重要,我们的目标是自始至终都具有强大的类型执行能力。到目前为止一切顺利,但我在这里遇到了障碍。

我们有一个实体,我称之为 Gadget:

public class GadgetDto
{
    public int Id { get; set; }
    // other stuff...
}

通过 AutoQuery,我们有一个端点 returns 一个列表 Gadgets:

[Route("/query/gadgets", HttpMethods.Get)]
public class QueryableGadget : QueryData<GadgetDto>
{
}

但是,需要创建 Gadget 的多个 class,因此我重构了小工具,使其派生自基础 class 和接口:

public interface IGadget
{
    int Id { get; set; }
}

public abstract class GadgetBase : IGadget
{
    public int Id { get; set; }
}

public class TabbedGadget : GadgetBase
{
    public List<Tab> Tabs { get; set; }
}

并且我重构了我们的端点以代替接口:

[Route("/query/gadgets", HttpMethods.Get)]
public class QueryableGadget : QueryData<IGadget>

这很好用。由于我们使用 QueryData,我们可以创建一个 List<IGadget> 作为响应发回,其中包含每个实现类型。

我遇到的问题是获取为派生的 classes 生成的 Typescript 类型,例如 GadgetBaseTabbedGadget。我明白为什么它们没有自动生成,因为 API 元数据中没有使用这些类型,但到目前为止,我对如何与 Typescript 客户端沟通该列表可能包含具体数量一无所知实现 IGadget 的类型,以及如何生成这些类型。

有没有办法,通过某些 ServiceStack 属性或通过不同的方法,我可以 'force' 生成这些 Typescript 类型并将它们公开在元数据中 (/types/typescript)?

提前致谢!

我强烈反对 using interfaces in DTOs,让多个请求 DTO 实现相同的接口很好,但它不应该用来代替具体的 DTO。

话虽如此,您可以创建一个 Dummy 服务来保存对所有 DTO 的引用,例如:

public class DummyHolder : IReturnVoid
{
    public GadgetDto GadgetDto { get; set; }
    //...
}

public class DummyService : Service
{
    public void Any(DummyHolder request){}
}

或者,您可以将它们添加到 AppHost.Configure() 中的 pre-defined NativeTypesFeature 中的 ExportTypes:

var nativeTypes = this.GetPlugin<NativeTypesFeature>();
nativeTypes.MetadataTypesConfig.ExportTypes.Add(typeof(GadgetDto));