Angularjs 我可以在函数中创建TypeScript类并引用其参数吗?

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

例如,在angularJS中,我可以使用以下结构:

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
的函数时,param
injectable
将被保留,并将进一步用于
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开始,类表达式就得到了支持。