当它编译我的代码时,TypeScript在每个文件的顶部都包含一个__extends声明:
var __extends = this.__extends || function (d, b) {
/* istanbul ignore next */
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
这在幕后工作得很好,但是当使用诸如karma-coverage之类的东西来生成报告时,它会产生不一致。该声明包含两个函数调用和代码中的一个分支(||用法),它只在第一个声明中被执行,留下了几十个(如果不是数百个)没有覆盖的后续声明。这使得在覆盖率报告中严重发现具有100%代码覆盖率的文件。
有没有人解决过这个问题?
答案 0 :(得分:3)
我在typescript codeplex找到了一个工作项。我希望打字员能很快解决这个问题。您可以在此处找到更多相关信息:typescript workitem 2002
答案 1 :(得分:3)
我刚刚在我的脚本任务中创建了一个函数,它将标题附加到任何使用继承的文件的顶部。这得到了代码覆盖率的提升。我使用伊斯坦布尔,所以我的功能如下:
function istanbulIgnoreTypeScriptExtend() {
var tsExtends = /^var __extends =/;
return through.obj(function(file, enc, done) {
if (file.isBuffer() && tsExtends.test(file.contents)) {
file.contents = Buffer.concat([
new Buffer('/* istanbul ignore next: TypeScript extend */' + os.EOL),
file.contents
]);
}
this.push(file);
done();
});
}
我实际上可以将它作为gulp插件发布,但我希望有很多方法可以很快解决问题。
答案 2 :(得分:1)
以下是使用@jedmao中提供的函数their answer和gulp任务的示例。
我稍微对其进行了修改,以处理var __extends=
不是文件中的第一件事(例如,如果您有'use strict'
或/// <references
标记。您可能也应该使用os.EOL
作为jedmao,而不是\n
,就像我在这里做的那样。
var gulp = require('gulp');
var through2 = require('through2');
gulp.task('my-gulp-task', function() {
gulp.src('*.ts')
.pipe(myTypeScriptCompiler())
.pipe(istanbulIgnoreTypeScriptExtend())
.pipe(gulp.dest('myDestFolder'));
});
function istanbulIgnoreTypeScriptExtend() {
var tsExtends = /var __extends =/;
return through2.obj(function(file, enc, done) {
if (file.isBuffer() && tsExtends.test(file.contents)) {
var rows = file.contents.toString().split('\n');
for (var i = 0; i < rows.length; i++) {
if (rows[i].indexOf('var __extends =') === 0) {
rows.splice(i, 0, '/* istanbul ignore next: TypeScript extend */');
break;
}
}
file.contents = new Buffer(rows.join('\n'));
}
this.push(file);
done();
});
}
答案 3 :(得分:1)
从2.1开始,typescript支持外部帮助库,所有发出的函数都转到tslib
包
npm install --save tslib
更改你的tsconfig:
{
"compilerOptions": {
//all the other stuff
"importHelpers": true
}
}
然后,如有必要,TypeScript将自动导入tslib
包
比如下面的例子
var tslib_1 = require("tslib");
var MyClass = (function (_super) {
tslib_1.__extends(MyClass, _super);
function MyClass() {
return _super !== null && _super.apply(this, arguments) || this;
}
return MyClass;
}(controller_1.Controller));
答案 4 :(得分:-2)
typescript编译器将在每个具有extends
关键字的文件之上生成此文件。使其成为一次使用的唯一方法是使用--out
编译器标志编译为单个js文件。