AngularJS类类型检查解决方案

时间:2015-08-26 06:18:03

标签: javascript angularjs typescript jsdoc

简而言之

如何对AngularJS的依赖注入环境中的用户定义类的构造函数和函数进行类型检查?

背景

我有一个带有大量数据对象的遗留angularjs代码。代码文件中填充了许多(约50个)简单的angularjs工厂,如:

    .factory('ContainerTypeModel', function () {
        var ContainerTypeModel = function (name, constantCode) {
            this.name = name || "";
            this.constantCode = constantCode || "";
        };
        return ContainerTypeModel;
    })

    .factory('ContainerTypeFactory', ['ContainerTypeModel', function (ContainerTypeModel) {
        var ContainerTypeFactory = {
            newByModel: function (/** ContainerTypeModel */model) {
                return new ContainerTypeModel(
                    model.name,
                    model.constantCode
                );
            }
        };
        return ContainerTypeFactory;
    }])

可悲的是,由于商业原因,我可能需要更改模型的属性(如ContainerTypeModel)。这肯定会导致构造函数和工厂函数调用参数不匹配。所以我

我的调查

打字稿:

可能需要重写所有遗留代码=。=

Facebook流程:

由于依赖注入,

可能无法正常工作。

JSDoc:

(我目前在WebStorm 10工作)仍然在弄清楚如何进行对象类型检查,比如检查ContainerTypeFactory.newByModel(model)中的参数。

2 个答案:

答案 0 :(得分:3)

  

可能需要重写所有遗留代码=。=

考虑转换自:

.factory('ContainerTypeModel', function () {
    var ContainerTypeModel = function (name, constantCode) {
        this.name = name || "";
        this.constantCode = constantCode || "";
    };
    return ContainerTypeModel;
})

到:

class ContainerTypeModel {
    name: string;
    constantCode: string;
    constructor (name, constantCode) {
        this.name = name || "";
        this.constantCode = constantCode || "";
    };
}
 // later
.service('ContainerTypeModel', ContainerTypeModel)

好消息是你可以逐步。当你确实进行转变时,它将开始突出显示错误......所以转换将主要由编译器引导

更多

结帐why typescriptmigrating from JavaScript to TypeScript

答案 1 :(得分:1)

您可以使用界面来描述您的商业模式,并使用工厂来创建您的域对象

类似的东西:

interface IContainerTypeModel {
  name : string;
  constantCode: string;
}

interface IContainerTypeFactory {
  (name:string, constantCode:string) : IContainerTypeModel; 
}

angular.factory('ContainerTypeFactory', function():IContainerTypeFactory {
    var containerTypeFactory : IContainerTypeFactory = function (name, constantCode) {
        return {
           name : name,
           constantCode : constantCode
        }
    };
    return containerTypeFactory;
});