Reinforced.Typings不会为具有UseModules的类型生成FQN(true,false)

时间:2018-02-05 12:46:58

标签: c# typescript code-translation reinforced-typings

要点:

我有两个项目的简单解决方案,例如ProjA和ProjB。在ProjA中,我使用Reinforeced.Typings工具将C#转换为TypeScript代码,为流程配置翻译流程指定了我的自定义RTConfigure方法。在ProjB中,我定义了用于翻译的C#ViewModel类。

问题:

在ProjB中,我在三个单独的文件中定义了三个类,每个文件都属于其特定的命名空间。通过调用例如全局构建器配置时builder.UseModules(true, false)生成的代码不包括引用关键字extends之后的类型的转换类型的完全限定名称空间名称,以及指定为另一个类的成员的类型(属于不同于使用过的成员类型之一。)

例如:

  1. ProjB.Ns1.Class1
  2. ProjB.Ns2.Class2
  3. ProjB.Ns3.Class3
  4. 这三个类只定义了两个简单的道具,其中Class3通过包含一个类型为Class1的额外属性而略有不同。 Class2继承自Class1。

    以下是示例代码:

    // Class1.cs
    namespace ReinforcedTypings.DifferentNamespaces.Ns1
    {
      public class Class1
      {
        public int AnIntegerPropNs1 { get; set; }
        public string AStringPropNs1 { get; set; }
      }
    }
    
    // Class2.cs
    using ReinforcedTypings.DifferentNamespaces.Ns1
    
    namespace ReinforcedTypings.DifferentNamespaces.Ns2
    {
      public class Class2 : Class1
      {
        public int AnIntegerPropNs2 { get; set; }
        public string AStringPropNs2 { get; set; }
      }
    }
    
    // Class3.cs
    using ReinforcedTypings.DifferentNamespaces.Ns1
    
    namespace ReinforcedTypings.DifferentNamespaces.Ns3
    {
      public class Class3
      {
        public int AnIntegerPropNs3 { get; set; }
        public string AStringPropNs3 { get; set; }
        public Class1 AClass1PropNs3 { get; set; }
      }
    }
    

    configure方法非常简单,定义如下:

      public static class RTConfig
      {
        public static void Configure(ConfigurationBuilder builder)
        {
          var types = typeof(ReinforcedTypings.DifferentNamespaces.Ns1.Class1).Assembly.GetTypes().ToList();
    
          builder.ExportAsClasses(types.Where(x => x.IsClass), c => c.WithAllFields().WithAllMethods().WithAllProperties());
          builder.Global(c => c.UseModules(true, false));
          // ^ commenting out this line will also cause a different error
        }
      }
    

    我使用.xml配置文件通过将以下选项(false)设置为:

    来指定转换应该全部生成一个文件
    <RtDivideTypesAmongFiles>false</RtDivideTypesAmongFiles>
    

    ...这会产生以下TypeScript代码(在.xml配置文件中设置的translated.ts):

    export namespace ReinforcedTypings.DifferentNamespaces.Ns3 {
        export class Class3
        {
            public AnIntegerPropNs3: number;
            public AStringPropNs3: string;
            public AClass1PropNs3: Class1; // <- error here
        }
    }
    export namespace ReinforcedTypings.DifferentNamespaces.Ns2 {
        export class Class2 extends Class1  // <- error here
        {
            public AnIntegerPropNs2: number;
            public AStringPropNs2: string;
        }
    }
    export namespace ReinforcedTypings.DifferentNamespaces.Ns1 {
        export class Class1
        {
            public AnIntegerPropNs1: number;
            public AStringPropNs1: string;
        }
    }
    

    请注意Class1类型在扩展后以及private AClass1PropNs3: Class1;的翻译属性成员Class3中缺少其名称的完整命名空间表示法。

    这会导致TypeScript出现问题,因为未指定类型的完整(命名空间)路径名,因此找不到这些类型。

    观察到的问题:

    当不使用UseModules时,如果您注释掉该行,则会在已翻译的TypeScript代码中找到另一个问题,这是由于已翻译代码的顺序,即在{Class1中找不到Class3 {1}}因为它在声明之前使用。

    结论:

    我没有进入RT的来源,但我怀疑UseModules(true, false)存在一个问题,其中第二个参数明确指出不丢弃名称空间,另一个问题是关于输出代码的顺序。无论如何,如果将第二个参数值设置为false,则可以预期始终和所有地方都具有所使用类型的FQN。如果我误解了这个配置道具的用法,那么我建议有这样的全局配置将强制使用FQN用于所有/所需类型将是非常有益的。

1 个答案:

答案 0 :(得分:1)

绝对FQN问题是RT的错误,并在版本1.4.6中修复。

关于附带问题:请参阅this GitHub Discussion