多个__extends声明的Typescript代码覆盖率

时间:2014-03-03 19:06:04

标签: typescript code-coverage karma-runner istanbul

当它编译我的代码时,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%代码覆盖率的文件。

有没有人解决过这个问题?

5 个答案:

答案 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文件。