如何更改AngularJS服务以使用Typescript?

时间:2014-07-25 17:20:17

标签: javascript angularjs typescript

我有这项服务:

app.factory('utilityService', [
    '$http',
    '$angularCacheFactory',
    utilityService
]);

function utilityService(
    $http,
    $angularCacheFactory
    ) {

    var factory = {};

    factory.rowClicked = function ($index, collection) {
        var row = collection[$index];
        if (row.current) {
            row.current = false;
            return null;
        } else {
            collection.forEach(function (object) {
                object.current = false;
            });
            row.current = true;
            return $index;
        }
    };

    factory.isArrayAndNotEmpty = function (theArray) {
        var rc = typeof theArray !== 'undefined' && theArray.length > 0;
        return rc;
    };


    return factory;

} 

在打到rowClicked之前, Typescript似乎能识别出一切正常(以及我没有在这里显示以节省空间的所有其他功能)。对于这些,它给出了消息:

factory.rowClicked

The property rowClicked does not exist on value of type '{}'

2 个答案:

答案 0 :(得分:2)

var factory = {};

TypeScript从其初始化程序中推断出factory的类型。在这里,您已经说factory没有成员,因此任何在其上读取或写入属性的尝试都将失败。

您只需将factory的类型更改为any

var factory: any = {};

这将使读取或写入factory的任何属性成为有效,但这可能过于宽松。你也可以写出它的类型:

var factory: {
    rowClicked($index, collection);
} = <any>{};

如果您有$indexcollection的类型,则可以进一步改进类型:

var factory: {
    rowClicked($index: MyIndexService, collection: MyRowCollectionType);
} = <any>{};

答案 1 :(得分:0)

您可以将TypeScript类用于服务,无需TypeAssertions(或手动接口)即可获得更大的TypeSafety。

您需要使用angular.service代替angular.factory。参考:https://www.youtube.com/watch?v=Yis8m3BdnEM&hd=1