[英]TypeScript compile-time constants?
我正在用 TypeScript 编写一个库,我想同时针对 Node 和浏览器。 现在我正在用两个不同的目标运行tsc
两次。 那部分工作正常。
但是,我的一小部分代码是特定于目标的。 我需要能够执行以下操作:
if(BUILD_TARGET === 'node') {
// do something
} else {
// do something else
}
有什么方法可以在编译时注入这些常量,以便它们可以被tsc
本身优化掉,也可以通过 UglifyJS(或某些此类工具)进行优化?
打字稿中最接近编译时常量的是const enums
- 根据文档,“Const 枚举成员在使用站点内联”。 Typescript 不会消除死代码,之后您将不得不使用其他工具来删除if (0 === 1)
分支。
您将需要两个不同的tsconfig.json
文件,每个文件都将包含一个对相同枚举类型具有不同定义的文件。
tsconfig.browser.json
{
"files": [
"t.ts",
"target-enum-browser.d.ts"
]
}
目标枚举浏览器.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 }
}
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('?');
}
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); })();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.