簡體   English   中英

打字稿:undefined不是構造函數

[英]Typescript: undefined is not a constructor

我有一個正在與Mocha / Chai測試的克隆函數:

export function clone(source: any): any {
    let output = {};
    if (isObject(source)) {
        (<any>Object).keys(source).forEach(key => {
            (<any>Object).assign(output, { [key]: source[key] });
        });
    }
    return output;
}

這是測試:

let obj = {
    a: [
        {
            a: 3,
            b: 5,
            c: [6, 8]
        }
    ]
};

it('clone(object) creates deep clone', () => {
    let cloned = ObjectHelper.clone(obj);

    expect(cloned.a[0].a).to.equal(3);
    expect(cloned.a[0].c[1]).to.equal(6);
});

但是我得到這個錯誤:

undefined is not a constructor (evaluating 'Object.assign(output, (_a = {}, _a[key] = source[key], _a))')

這只會在測試中失敗,而不會在瀏覽器中失敗。

業力配置:

module.exports = function(config) {
    config.set({
        /*
         * Enable or disable watching files and executing the tests whenever
         * one of the files in the 'files' field is changed.
         */
        autoWatch: true,

        /*
         * The root path location that will be used to resolve all relative
         * paths defined in 'files' and 'exclude'.
         */
        basePath: '',

        /*
         * List of browsers to launch and capture tests in. In order to use a
         * specified browser, you must npm install the corresponding
         * karma-***-launcher.
         * http://karma-runner.github.io/0.13/config/browsers.html
         */
        browsers: ['PhantomJS'],

        // Enable or disable colors in the output (reporters and logs)
        colors: true,

        // List of files/patterns to exclude from loaded files
        exclude: [],

        /*
         * The files array determines which files are included in the browser
         * and which files are watched and served by Karma. The order of patterns
         * determines the order in which files are included in the browser.
         * http://karma-runner.github.io/0.13/config/files.html
         */
        files: [
            'src/**/*.spec.ts'
        ],

        /*
         * List of test frameworks you want to use. For example, if you want to
         * use mocha, chai, and sinon, you'll need to npm install their
         * corresponding karma-*** modules and include them in the list of plugins
         * as well as below.
         */
        frameworks: ['mocha', 'chai', 'sinon'],

        logLevel: config.LOG_INFO,

        /*
         * By default, Karma loads all sibling NPM modules which have a name
         * starting with karma-*. You can also explicitly list plugins you want
         * to load via the plugins configuration setting.
         */
        plugins: [
            'karma-*'
        ],

        // The port where the Karma web server will be listening.
        port: 9876,

        /*
         * A map of preprocessors to use. Requires the corresponding karma-*
         * npm module to be npm installed and added to the 'plugins' field.
         */
        preprocessors: {
            'src/**/*.spec.ts': ['webpack']
        },

        /*
         * A list of reporters to use to display the test results. In order to
         * use the karma-mocha-reporter, you must npm install the module and
         * include it in the list of plugins.
         */
        reporters: ['mocha'],

        /*
         * If true, Karma will start and capture all configured browsers, run
         * tests and then exit with an exit code of 0 or 1 depending on whether
         * all tests passed or any tests failed.
         */
        singleRun: false,

        /*
         * This field is necessary because we are using webpack as a preprocessor.
         * You will need to specify the webpack configuration (although in this
         * case, we are simply leveraging the existing webpack.config.js file).
         *
         * If you have a different webpack.config.js file that's used for testing
         * purposes, you can specify that here.
         */
        webpack: {
            module: webpackConfig.module,
            resolve: webpackConfig.resolve
        }
    });
};

我認為您的問題是您的環境沒有實現Object.create ,即您沒有ES6功能。

這是針對PhantomJs的polyfil: https ://www.npmjs.com/package/phantomjs-polyfill-object-assign

另外,您可以將它以typescript形式進行過濾(只是這樣,您就不必將其強制轉換為any ):

interface ObjectConstructor {
    keys(o: any): string[];
    assign(target: any, ...sources: any[]): any;
}

如果將ES6用作編譯器的目標,則不需要此polyfil,因為它已經內置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM