当前位置: 首页 > 知识库问答 >
问题:

在业力中用“Tsify”启用“装饰者的实验性支持”

关志勇
2023-03-14

在karma单元测试中,我使用browserify的插件tsify来传递我的代码

当我运行测试时,我会遇到这样的错误:

module.exports = function(config) {
  config.set({
    browsers: ['Chrome'],
    frameworks: ['jasmine', 'browserify', 'es6-shim'],
    files: [
      'src/**/*.spec.ts'
    ],
    preprocessors: {
      '**/*.ts': ['browserify']
    },
    browserify: {
      debug: true,
      plugin: ['tsify'],
      transform: ['browserify-shim']
    }
  });
};

这是我的gulp文件(我认为这无关紧要)

var gulp = require('gulp');
var Server = require('karma').Server;

/**
 * Run test once and exit
 */
gulp.task('test', function (done) {
  new Server({
    configFile: __dirname + '/karma.conf.js',
    singleRun: true
  }, done).start();
});

/**
 * Watch for file changes and re-run tests on each change
 */
gulp.task('tdd', function (done) {
  new Server({
    configFile: __dirname + '/karma.conf.js'
  }, done).start();
});

gulp.task('default', ['tdd']);

共有1个答案

伍昱
2023-03-14

有两个编译器选项与装饰器相关:

--emitDecoratorMetadata
--experimentalDecorators

通常,它们将在项目的tsconfig.json文件中启用(tsify将搜索并加载tsconfig.json):

{
    "compilerOptions": {
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "target": "es5"
    },
    "files": []
}

如果出于某种原因,您没有使用tsconfig.json文件,可以在Karma中的Browserify插件配置中启用它们(请注意数组中的数组):

browserify: {
    debug: true,
    plugin: [['tsify', {
        emitDecoratorMetadata: true,
        experimentalDecorators: true
    }]],
    transform: ['browserify-shim']
}

它们也可以通过命令行启用:

browserify -p [tsify --emitDecoratorMetadata --experimentalDecorators] main.ts > bundle.js
 类似资料:
  • 对装饰器的实验性支持是一个特性,在未来的版本中可能会发生变化。设置‘实验装饰器’选项‘以删除此警告。 ...尽管tsconfig.json中的compilerOptions具有以下设置: 奇怪的是,一些使用装饰器的随机类不显示警告,但同一项目中的其余类却显示警告。

  • 我试图在angular项目中生成新模块 与新模块生成的路由模块相同。 对于,我在项目中的每个tsconfig文件中都添加了它 tsconfig.app.json 另一件事是,当我试图将它导入app.module时,它没有显示出来,我想是因为那个错误

  • 嗨,更新到最新的WebStorm,我现在得到这个错误: 但是在我的tsConfig中被设置为true:

  • 有时我们不希望某个类天生就非常庞大,一次性包含许多职责。那么我们就可以使用装饰者模式。 装饰者模式可以动态地给某个对象添加一些额外的职责,从而不影响这个类中派生的其他对象。 装饰者模式将一个对象嵌入另一个对象之中,实际上相当于这个对象被另一个对象包装起来,形成一条包装链。 一、不改动原函数的情况下,给该函数添加些额外的功能 1. 保存原引用 window.onload = function() {

  • 问题内容: 考虑这个小例子: 哪个打印 为什么参数(应该是Test obj实例)没有作为第一个参数传递给装饰函数? 如果我手动进行操作,例如: 它按预期工作。但是,如果我必须事先知道某个函数是否装饰,它就破坏了装饰器的全部目的。这里的模式是什么,还是我误会了什么? 问题答案: tl; dr 您可以通过将类作为描述符并返回部分应用的函数来解决此问题,该函数从中应用对象作为参数之一,如下所示 实际问题

  • 装饰者模式可以动态的给指定的类添加一些行为和职责,而不用对原代码进行任何修改。当你需要使用子类的时候,不妨考虑一下装饰者模式,可以在原始类上面封装一层。 在 Swift 里,有两种方式实现装饰者模式:扩展 (Extension) 和委托 (Delegation)。