在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']);
有两个编译器选项与装饰器相关:
--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)。