【问题标题】:Typescript: undefined is not a constructor打字稿:未定义不是构造函数
【发布时间】:2016-07-07 08:51:35
【问题描述】:

我有一个正在使用 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
        }
    });
};

【问题讨论】:

  • 你能提供你用来测试的obj吗?
  • @NitzanTomer 谢谢,我已将它添加到测试代码块中。它在Object.assign()的第一次评估中失败了
  • 你是如何运行测试的?在浏览器中还是以其他方式?
  • 我正在使用 Karma 和 PhantomJS 运行它们 - 只需将 karma conf 添加到帖子中。
  • 你的类型不好,如果确实克隆了,克隆应该采用T并返回T,并且还应该尊重原型链。

标签: javascript typescript mocha.js chai


【解决方案1】:

我认为您的问题是您的环境没有实现Object.create,即您没有ES6 功能。

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

此外,您可以在 typescript 中对其进行 polyfil(这样您就不必将其转换为 any):

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

如果你使用 ES6 作为编译器的目标,那么你就不需要这个 polyfil,因为它已经内置了。

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多