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"
]
}
