TypeScript编译时常量?

wnavrhmk  于 2022-12-30  发布在  TypeScript
关注(0)|答案(2)|浏览(158)

我正在用TypeScript编写一个库,我想同时以Node和Browser为目标。现在我运行了tsc两次,使用了两个不同的目标。这部分工作正常。
然而,我的代码中有一小部分是特定于目标的。我需要能够做如下事情:

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

有没有什么方法可以在编译时注入这些常量,这样它们就可以由tsc本身优化掉,或者通过UglifyJS(或类似的工具)优化掉?

i34xakig

i34xakig1#

typescript中最接近编译时常量的是const enums-根据文档,“与常规枚举不同,它们在编译时被完全删除”。
然而,这是有代价的--最大的警告是const枚举与捆绑商经常使用的isolatedModules = true模式不兼容。
此外,Typescript不会做死代码消除,你将不得不使用一些其他的工具来删除if (0 === 1)分支之后。
您将需要两个不同的tsconfig.json文件,每个文件将包含一个对相同枚举类型具有不同定义的文件。

tsconfig.浏览器.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"
  ]
}

目标枚举节点.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('?');
}
uubf1zoe

uubf1zoe2#

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); })();

相关问题