网站搜索

TypeScript:如何防止输出含有错误的代码?


有一个常见的误解认为“Typescript 是 Javascript 的超集”。
这不正确,下面是两个简单的例子,其中有效的 Javascript 会导致 Typescript 编译器报错:

var a = { foo: 1 };
a.bar = 2; // member does not exist on a

console.log(1 == "1"); // comparison of incompatible types

在很多报告错误的情况下,Typescript 编译器仍然会输出 Javascript。对于上面的示例,这可能是有意义的。它可以支持更容易的增量迁移到严格静态类型。

然而,也存在某些情况下,TypeScript 编译器会捕获那些应被视为错误的错误,这些错误可能会在你的 JavaScript 程序中导致危险的未指定行为。例如,在 ES6 中,模块导出是只读的。你不应该能够写入模块的导出成员。截至本文撰写时,node v13.14.0 并未强制执行这一点。

module.ts:

export var num = 1;

// just as a reference, the proper way to access num
export const setNum = (newNum:number)=>{
    num=newNum;
}
export const getNum = ()=>num;

main.ts:

import * as mod from './mod'

console.log(mod.num); // outputs 1
mod.num=2;            // compiler error
console.log(mod.num); // outputs 2

尽管抛出了错误,编译器仍然会转换为 JavaScript,并忽略危险的“写入只读”操作。

在这种情况下,我想阻止编译器产生输出。这可能吗?

答案#1

TypeScript 编译器选项使得可以指定:

 --noEmitOnError

默认情况下,这个标志设置为 false。但在遇到有缺陷的代码被生成的严重副作用后,我将在 tsconfig.json 中始终将其设置为 true:

{
    "compilerOptions": {
        //...
        "strict": true,
        "noEmitOnError": true
    },
    "exclude": [
        "node_modules"
    ]
}