首页 文章

预处理器在Typescript中定义

提问于
浏览
8

在c#中,您可以执行#if DEBUG ...在调试时执行一些特殊操作 . 我想在Typescript中做类似的事情,以便我可以在测试时设置表单值 .

任何人都有关于如何在Typescript中实现这一点的任何建议?

我提出的最好的是设置类:

export class Settings {
    static isDebugging = false;
};

然后在启动应用程序时,我将其设置为true .

然后在代码中,我导入类并检查它是否为真 .

if (Settings.isDebugging)...

似乎工作正常 .

3 回答

  • 2

    如果你想从C#中获得类似于 #if 指令的东西,那么在构建应用程序时你必须制作一些剥离某些代码的东西 .

    为此,您可以使用一些构建插件 . 有一些构建插件(参见herehere)将在构建时剥离这样的注释内的代码:

    /* test-code */
    removeMeInProduction();
    /* end-test-code */
    

    但是,通过使用这些插件,您可能会在 test-codeend-test-code 的拼写错误中导致您将测试代码留在 生产环境 中 . 你不会得到关于它的编译错误 .

    因此,最好找到一个基于其名称去除函数的构建插件(参见here - 很遗憾,我找不到这个插件) . 那样你就可以这样写:

    function ifNotProduction(func: () => void) {
        func();
    }
    

    然后使用它:

    ifNotProduction(() => {
        console.log("Only run when test.");
    });
    

    然后告诉构建脚本在它不是 生产环境 版本时去掉该函数的使用 .

    总的来说,只需检查一个布尔值的简单解决方案就足够了 .

  • 1

    #if DEBUG 这样的标志在TypeScript中不可用,因为编译输出始终是相同的 . 在C#中编译为调试模式时, DLL 文件包含一些用于调试的额外信息 . 在发布模式下,信息被省略, DLL 文件更轻 .

    如果您使用自动构建环境(如GulpGrunt),则可以将设置存储在 /config/debug/config.ts/config/release/config.ts 等文件夹下,然后您可以创建两个任务:

    一个用于调试:

    $ gulp bundle-debug
    

    一个发布

    $ gulp bundle-release
    

    复制一个或另一个文件 .

  • 2

    有一些代码可以将预处理程序指令添加到TypeScript中:https://github.com/Microsoft/TypeScript/issues/4691

    但是,它正在讨论中它是否会成为TypeScript的一部分 . 然后,解决方法主要是使用外部构建工具,或不同的配置选项(在编译时剥离代码)和魔术变量(在运行时只禁用代码路径)

相关问题