【问题标题】:Typelite POCO Class GenerationTypelite POCO 类生成
【发布时间】:2019-03-08 12:23:16
【问题描述】:

Typelite 是否可以生成 TypeScript 类而不是接口?比如:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

export class Person
{
    constructor() {}
    FirstName: string;
    LastName: string;
}

我不是在生成的类中寻找任何功能,只是一种更简单的方法,可以在客户端实例化类,而无需初始化整个接口。

例如,我希望能够做到这一点:

var person = new Person();

代替

var person = {
    FirstName: null,
    LastName: null
};

【问题讨论】:

    标签: typescript typelite


    【解决方案1】:

    我所做的只是对 tt 文件进行了简单的调整,使您免于编译自己的 typelite:

    <#= definitions.ToString()
    .Replace("interface", "export class")
    .Replace("declare module", "module") #>
    

    【讨论】:

    • 谢谢。这很有帮助。这确实意味着我需要生成 2 个文件,因为我只对特定类上发生的这种情况感兴趣。
    • 我在哪里进行此更改?你能分享你的 TypeLite.Net4.tt 类吗
    【解决方案2】:

    Reinforced.Typings 支持此功能。

    使用属性

    [TsClass]
    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    fluent call

    public class Configuration
    {
        public static void Configure(ConfigurationBuilder builder) 
        {
                builder
                    .ExportAsClass<Person>()
                    .WithPublicProperties();
        }
    }
    

    将在输出文件中生成以下内容:

    namespace MyApp {
        export class User
        {
            public FirstName: string;
            public LastName : string;
        }
    }
    

    【讨论】:

      【解决方案3】:

      很遗憾,目前不支持这种情况。

      我从来没有错过过这样的功能,因为类通常有一些方法,所以对我来说没有意义。但是请随意摆弄源代码('TsGenerator.cs'),如果您不需要类中的任何方法,生成类而不是接口应该不会太难。

      【讨论】:

      • 谢谢。对我来说,生成一个类是有意义的,其中所有属性都有私有设置器并从构造函数初始化。通过这种方式,在客户端逃避初始化错误会更容易。但不确定是否有可能。
      • 当然有可能,但是类不能有任何行为(如方法),因为每次运行 TypeLite 时,您的自定义代码都会丢失。如果 TypeScript 支持部分类之类的东西,我将添加对生成类的支持,但我不知道 TypeScript 的这种概念。
      • 对我来说,方法没有任何必要,因为在我看来,向 DTO 添加行为是一种不好的做法。只是一个有ctor的类
      • 我的用例只是针对没有行为的 DTO。我实际上只是想实例化一个满足接口的类,而不必重新创建 Typelite 已经为我做得很好的东西。我完全期望必须通过其他方式附加行为或价值观。
      • 这听起来像是一个常见的请求。有没有地方可以向 litesolutions.net 提出此类功能请求?
      【解决方案4】:

      扩展上面@Flores 的答案,在最新版本的 TypeLite(目前为 1.8.4)中,您可以修改对 ts.Generate(...) 的调用,如下所示:

      <#= ts.Generate(TsGeneratorOutput.Properties)
          .Replace("interface", "export class")
          .Replace("declare module", "module") #>
      

      完全变换:

      <#@ template debug="false" hostspecific="True" language="C#" #>
      <#@ assembly name="$(TargetDir)TypeLite.dll" #>
      <#@ assembly name="$(TargetDir)TypeLite.Net4.dll" #>
      <#@ assembly name="$(TargetDir)MyAssembly.dll" #>
      
      <#@ import namespace="TypeLite" #> 
      <#@ import namespace="TypeLite.Net4" #> 
      <#@output extension=".d.ts"#>
      
      <#@include file="Manager.ttinclude"#>
      <# var manager = Manager.Create(Host, GenerationEnvironment); #>
      
      <# var ts = TypeScript.Definitions()
          .WithReference("Enums.ts")
          .ForLoadedAssemblies();
      #>
      
      <#= ts.Generate(TsGeneratorOutput.Properties)
          .Replace("interface", "export class")
          .Replace("declare module", "module") #>
      
      <# manager.StartNewFile("Enums.ts"); #>
      <#= ts.Generate(TsGeneratorOutput.Enums) #>
      <# manager.EndBlock(); #>
      <# manager.Process(true); #>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 2011-11-16
        • 2015-11-10
        • 1970-01-01
        • 2012-11-14
        • 2011-02-08
        • 2019-03-30
        相关资源
        最近更新 更多