变体类型和非变体类型

时间:2015-10-12 15:27:56

标签: typelite

我尝试将typelite与实体框架和Identity框架一起使用。 在身份框架中,以TypeName<Tkey>TypeName: TypeName<String>格式存在各种类型。 typelite正确导出类型,但这种行为在打字稿中是不可能的,我应该如何处理呢?

类别:

namespace DTO
{
    [TypeLite.TsClass]
    public class Test : Test<String>
    {
    }

    public class Test<TKey>
    {
        public TKey Id { get; set; }
        public String Name { get; set; }
    }
}

配置1:

<# var ts = TypeScript.Definitions()
    .WithReference("Enums.ts")
    .ForLoadedAssemblies();
#>

输出1,这里的错误是:类型'Test<TKey>'以递归方式引用自身作为基本类型。

declare module DTO {
    interface Test extends DTO.Test<string> {
    }
    interface Test<TKey> {
        Id: TKey;
        Name: string;
    }
}

配置2:

<# var ts = TypeScript.Definitions()
    .WithReference("Enums.ts")
    .ForLoadedAssemblies()
    .WithTypeFormatter((type, f) => "I" + ((TypeLite.TsModels.TsClass)type).Name);
#>

输出2,这里的变种类型也得到了我,而且事情搞得很糟糕

declare module DTO {
    interface IUser {
        Id: string;
        Name: string;
        Surname: string;
        UserName: string;
        Email: string;
        Roles: string[];
    }
    interface ITest extends DTO.ITest {
    }
    interface ITest {
        Id: ITKey;
        Name: string;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您同时具有相同名称的泛型和非泛型类型,则必须在同一名称空间中为它们指定一个略有不同的名称。

将模型定义更改为:

var ts = TypeScript.Definitions()
    .WithReference("Enums.ts")
    .ForLoadedAssemblies();
ts.WithTypeFormatter((t, f) => GenerateTypeName(t, f, ts.ScriptGenerator));

最后添加:

<#+
    private string GenerateTypeName(TsType tsType, ITsTypeFormatter f, TsGenerator gen)
    {
        TsClass tsClass = (TsClass) tsType;

        string name = tsClass.Name;
        if (!tsClass.GenericArguments.Any())
            return name;

        name += "_" + tsClass.GenericArguments.Count;

        name += "<" + string.Join(",", tsClass.GenericArguments.Select(arg =>
        {
            string suffix = "";
            var argCol = arg as TsCollection;
            if (argCol != null)
            {
                suffix = string.Join("", Enumerable.Repeat("[]", argCol.Dimension));
            }
            return gen.GetFullyQualifiedTypeName(arg) + suffix;
        })) + ">";

        return name;
    }
#>

它将生成:

declare module DTO {
    interface ITest extends DTO.ITest_1<string> {
    }
    interface ITest_1<TKey> {
        Id: TKey;
        Value: string;
    }
}