有条件地使用TypeWriter发出一个方法

4
我正在使用Typewriter将C#模型生成TypeScript类,这是一款很不错的工具。以下是我的现有模板,已经完全能够正常工作:

我正在使用TypeWriter将我的C#模型转换成TypeScript类。它的效果非常好。以下是我的现有模板,它可以正常工作:

${
    using Typewriter.Extensions.Types;

    Template(Settings settings)
    {
        settings.IncludeProject("ProjectName.Api");
        settings.OutputFilenameFactory = file => 
        {
            return file.Name.Replace("Dto.cs", ".ts");
        };
    }

    string DtoName(Class t) { return t.Name.Replace("Dto", ""); }
    string MapTypeName(Property p) { return MapTypeName(p.Type); }

    string MapTypeName(Type t)
    {
        var typeArguments = t.TypeArguments.ToList();

        if (typeArguments.Count == 1 && t.IsEnumerable)
        {
            return $"{MapTypeName(typeArguments[0])}[]";
        }

        if (typeArguments.Count == 2 && t.Name == $"KeyValuePair<{typeArguments[0]}, {typeArguments[1]}>")
        {
            return $"{{ key: {typeArguments[0]}; value: {typeArguments[1]}}}";
        }

        return t.Name.Replace("Dto", "");
    }
}

module CompanyName.Models.Api {
    $Classes(ProjectName.Api.Models.*Dto)[
    export class $DtoName {
        $Properties[
        public $name: $MapTypeName = $Type[$Default];]
    }]
}

我希望能够根据特定类型有条件地向该模板添加方法。我认为以下代码可以实现此功能:
module CompanyName.Models.Api {
    $Classes(ProjectName.Api.Models.*Dto)[
    export class $DtoName {
        $Properties[
        public $name: $MapTypeName = $Type[$Default];]

        ${
            if ($name == "ADto") 
            {
                // I want to emit this code:
                //    public getStatistic(appType: string, status: string): number {
                //        const retval = _.find(this.data, { appType: appType, status: status });
                //        return retval ? retval.count : 0;
                //    }
            }
        }
    }]
}

但是它不喜欢这种语法,我得到了5个打字机错误,包括“未预料的标记”和“无效的标记”。我尝试了一个变体:
module CompanyName.Models.Api {
    $Classes(ProjectName.Api.Models.*Dto)[
    export class $DtoName {
        $Properties[
        public $name: $MapTypeName = $Type[$Default];]

        $if ($name == "ADto") 
        {
            // I want to emit this code:
            //    public getStatistic(appType: string, status: string): number {
            //        const retval = _.find(this.data, { appType: appType, status: status });
            //        return retval ? retval.count : 0;
            //    }
        }
    }]
}

但是 Typewriter 发出了整个 $if { ... } 块,这并不是我想要的。

我是否必须为此类创建第二个模板,还是可以使用条件语句来实现?如果可以,应该怎么做?

1个回答

3

根据这个Github问题评论,我找到了解决方法。

在模板之上的主体部分中,添加此辅助函数:

bool IsStatisticsClass(Class c)
{
    return c.Name == "ADto";
}

这提供了一种包装(我不确定正确的术语是什么)。我们可以使用$IsStatisticsClass[ ... ] 条件地添加代码。模板本身变成了:
module CompanyName.Models.Api {
    $Classes(ProjectName.Api.Models.*Dto)[
    export class $DtoName {
        $Properties[
        public $name: $MapTypeName = $Type[$Default];]
        $IsStatisticsClass[            
        // This code is now emitted for a single class:
        //    public getStatistic(appType: string, status: string): number {
        //        const retval = _.find(this.data, { appType: appType, status: status });
        //        return retval ? retval.count : 0;
        //    }]
    }]
}

为了与我的问题保持一致,我将生成的TypeScript代码保留为注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接