AngularJS class 键入检查解决方案

AngularJS class type check solution

简而言之

我如何对用户定义的 class 的构造函数和函数进行类型检查,通常是在 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).

中的参数

may need to rewrite all the legacy code=.=

考虑来自的转换:

.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 typescript and migrating from JavaScript to TypeScript.

您可以使用接口来描述您的业务模型,并使用工厂来创建您的域对象

类似于:

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;
});