TypeScript编译时常量?

时间:2017-06-16 23:12:25

标签: typescript

我正在用TypeScript编写一个库,我想要同时定位Node和Browser。现在我用两个不同的目标运行tsc两次。那部分工作正常。

但是,我的一小部分代码是针对特定目标的。我需要能够做到这样的事情:

if(BUILD_TARGET === 'node') {
    // do something
} else {
    // do something else
}

有没有什么方法可以在编译时注入这些常量,以便它们可以通过tsc本身或通过UglifyJS(或某些此类工具)进行优化?

2 个答案:

答案 0 :(得分:4)

最接近打字稿中编译时常量的是const enums - 根据documentation," Const enum成员在使用网站上内联"。打字稿不会消除死代码,之后您将不得不使用其他工具删除if (0 === 1)分支。

您需要两个不同的tsconfig.json文件,每个文件都包含一个文件,该文件对同一个枚举类型有不同的定义。

<强> tsconfig.browser.json

{
  "files": [
    "t.ts",
    "target-enum-browser.d.ts"
  ]
}

<强>目标枚举browser.d.ts

declare module 'target-enum' {
    export const enum Target { Node, Browser, Current = Browser }
}

<强> tsconfig.node.json

{
  "files": [
    "t.ts",
    "target-enum-node.d.ts"
  ]
}

<强>目标枚举node.d.ts

declare module 'target-enum' {
    export const enum Target { Node, Browser, Current = Node }
}

<强> t.ts

import {Target} from 'target-enum';

if (Target.Current === Target.Browser) {
    console.log('browser');

} else if (Target.Current === Target.Node) {
    console.log('node');

} else {
    console.log('?');
}

使用tsc --project tsconfig.browser.json

编译
"use strict";
exports.__esModule = true;
if (1 /* Current */ === 1 /* Browser */) {
    console.log('browser');
}
else if (1 /* Current */ === 0 /* Node */) {
    console.log('node');
}
else {
    console.log('?');
}

使用tsc --project tsconfig.node.json

编译
"use strict";
exports.__esModule = true;
if (0 /* Current */ === 1 /* Browser */) {
    console.log('browser');
}
else if (0 /* Current */ === 0 /* Node */) {
    console.log('node');
}
else {
    console.log('?');
}

答案 1 :(得分:1)

https://github.com/Morglod/tsts

目前正在研究编译时转换器

const numbers = [ 1, 2, 3, 4, 5, 6, 7, 8 ];
const result = comptime(() => {
    return numbers.reduce((total, x) => sum(total, x), 0);
});

const result = (() => { return (36); })();