Angularjs 我可以在函数中创建TypeScript类并引用其参数吗?
例如,在angularJS中,我可以使用以下结构:Angularjs 我可以在函数中创建TypeScript类并引用其参数吗?,angularjs,typescript,Angularjs,Typescript,例如,在angularJS中,我可以使用以下结构: myApp.factory('MyFactory',函数(可注入){ 返回函数(param){ this.saySomething=函数(){ 警报(“Param=“+Param+”injectable=“+injectable”); } }; }); 以后可以这样使用: class MyFactory { constructor(private injectable, private param) {} saySomethi
myApp.factory('MyFactory',函数(可注入){
返回函数(param){
this.saySomething=函数(){
警报(“Param=“+Param+”injectable=“+injectable”);
}
};
});
以后可以这样使用:
class MyFactory {
constructor(private injectable, private param) {}
saySomething() {
alert(...);
}
}
myApp.factory('myFactory', function(injectable) {
return function(param) {
return new MyFactory(injectable, param);
}
});
功能(MyFactory){
新的我的工厂;
}
当调用传递给方法factory
的函数时,paraminjectable
将被保留,并将进一步用于MyFactory
的新实例,而无需再次指定该参数
现在我想使用TypeScript,显然我想指定我的MyFactory
是可更新的,并且有一个函数saySomething
。我怎么能优雅地做到这一点
我可以这样写:
class MyFactory {
constructor(private injectable, private param) {}
saySomething() {
alert(...);
}
}
myApp.factory('myFactory', function(injectable) {
return function(param) {
return new MyFactory(injectable, param);
}
});
但这改变了API:
function(myFactory) {
myFactory().saySomething();
}
我想知道它是否能更优雅,因为我喜欢“新”的表达方式,它清楚地表达了一个新的独特的对象被创建,而这个对象的创建是工厂的全部目的
我可以写这样的东西
我就是这么做的
我可以在函数中创建TypeScript类吗
不,它需要位于文件的顶层或模块中。仅供参考,如果我们能够在函数中创建它,那么该函数中的信息将被锁定,并且至少类型信息将是无用的。实例化MyFactory的多个实例的原因是什么?您不希望将工厂的单个实例注入到依赖代码中吗 我认为,使用您提供的类声明,在注入后实际上会像这样:
function(myFactory) {
myFactory.saySomething();
}
如果您真的需要将构造函数传递到依赖代码中,那么我认为您必须放弃TypeScript类,因为它们不能在函数内部定义,这意味着您将无法在注入此类函数的变量上创建闭包
您总是可以选择只使用TypeScript中的函数而不是类。仍然可以获得强大的键入功能,并且可以对其调用“new”,因为它在一天结束时仍然是一个.js函数。下面是一个更具类型脚本化的版本:
myApp.factory('MyFactory', (injectable: ng.SomeService) => {
return (param: string) => {
return {
saySomething: () {
alert("Param=" + param + " injectable=" +injectable);
}
};
};
});
**编辑:TypeScript>=1.6支持,您现在可以编写如下内容:
myApp.factory(injectable: SomeService) {
class TodoItem {
...
}
}
**原始答复:
我也有同样的问题:对于AngularJS和ES5,我喜欢依赖注入,不污染构造函数,并且能够使用new
关键字
使用ES6,您可以在函数中包装一个类,TypeScript还不支持这一点(请参阅)
下面是我所做的(MyFactory现在是todo应用程序中的类TodoItem,更具相关性):
与ES5和函数相比,这没有那么优雅(不使用带有TypeScript的类是不可能的):-/
我想写的是:
@Factory
@InjectServices(injectable: SomeService, ...)
class TodoItem {
title: string;
completed: boolean;
date: Date;
// No DI pollution
constructor() { }
saySomething() {
alert(this.injectable);
}
static createFromJson(data: string): TodoItem {
...
}
}
@Controller
@InjectFactories(TodoItem: TodoItem, ...)
class TodosCtrl {
constructor() { }
doSomething() {
var todoItem1 = new TodoItem();
var todoItem2 = TodoItem.createFromJson({title: "Meet with Alex"});
}
}
或具有以下功能:
myApp.factory(injectable: SomeService) {
class TodoItem {
title: string;
completed: boolean;
date: Date;
// No constructor pollution
constructor() { }
saySomething() {
alert(injectable);
}
static createFromJson(data: string): TodoItem {
...
}
}
}
myApp.controller(TodoItem: TodoItem) {
class TodosCtrl {
constructor() { }
doSomething() {
var todoItem1 = new TodoItem();
var todoItem2 = TodoItem.createFromJson({title: "Meet with Alex"});
}
}
}
相关问题:这个问题可以被命名为“TypeScript和AngularJS依赖项注入而不污染构造函数?”从TypeScript 1.6开始,类表达式就得到了支持。