You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何仅首个/*!注释在编译后的JavaScript中保留,其余丢失?

TypeScript编译仅保留首个/*!注释的原因及解决方法

你遇到的这个问题其实是TypeScript编译器的默认行为——默认情况下,tsc只会保留文件顶部的第一个/*!注释,后续的同格式注释会被当作普通块注释处理并移除。

为什么会这样?

TypeScript将文件开头的/*!注释认定为版权/许可证类注释,这类注释通常只会在文件顶部出现一次,所以编译器默认只保留这一个,其余的同格式注释就会被清理掉。

解决办法

给你两个可行的方案,根据你的需求选择:

方案1:关闭所有注释移除

如果希望保留所有注释(包括/*!、普通块注释和行注释),可以在编译时添加--removeComments false参数,或者在tsconfig.json中配置:

{
  "compilerOptions": {
    "removeComments": false
  }
}

对应的编译命令改为:

./node_modules/.bin/tsc tsfile.ts --removeComments false

这个方案的缺点是会保留所有注释,如果你只想保留特定的/*!注释,可能不太合适。

方案2:用@preserve标记需要保留的注释

如果你只想保留特定的/*!注释(其他普通注释仍可移除),可以在目标注释里添加@preserve指令,编译器就会保留这个注释,不管它在文件的哪个位置。

修改你代码里的最后一个注释:

/*!
 * Another comment that should be preserved!
 * @preserve
 */

这样编译后的JavaScript文件中,不仅会保留顶部的第一个/*!注释,这个带@preserve的注释也会被保留下来。

验证效果

以你的代码为例,修改后编译出的JS文件会包含:

/*!
 * tsfile.ts
 * - a demonstrative typescript file
 * - to compile: `./node_modules/.bin/tsc tsfile.ts`
 *
 * Copyright © Grateful | Fri Oct 09
 */
// Number
let num = 0.444;
let hex = 0xbeef;
let bin = 0b0010;
// Number
let num2 = 0.444;
let hex2 = 0xbeef;
let bin2 = 0b0010;
/*!
 * Another comment that should be preserved!
 * @preserve
 */
// Number
let num3 = 0.444;
let hex3 = 0xbeef;
let bin3 = 0b0010;
// 1. any
// 2. built-in ie number, string, boolean, undefined, null, void, etc
// 3. user-defined ie array, enum, array, class, interface, and tuple
// Number
let num4 = 0.444;
let hex4 = 0xbeef;
let bin4 = 0b0010;

(如果使用默认的removeComments: true,普通的/* */块注释会被移除,但带@preserve的/*!注释会保留)

内容的提问来源于stack exchange,提问作者Grateful

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:57:54