我有两个项目的简单解决方案,例如ProjA和ProjB。在ProjA中,我使用Reinforeced.Typings工具将C#转换为TypeScript代码,为流程配置翻译流程指定了我的自定义RTConfigure
方法。在ProjB中,我定义了用于翻译的C#ViewModel类。
在ProjB中,我在三个单独的文件中定义了三个类,每个文件都属于其特定的命名空间。通过调用例如全局构建器配置时builder.UseModules(true, false)
生成的代码不包括引用关键字extends
之后的类型的转换类型的完全限定名称空间名称,以及指定为另一个类的成员的类型(属于不同于使用过的成员类型之一。)
这三个类只定义了两个简单的道具,其中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用于所有/所需类型将是非常有益的。