Какой тип возвращаемого значения Typescript следует использовать для вызова $http, который возвращает ничего, кроме успеха?

Я создал службу с помощью Typescript:

class ConfigService implements IConfigService {

    public admin = {};
    public adminBackup = {};
    public user = {};
    public loaded = false;

    constructor(
        private $http: ng.IHttpService,
        private $q: ng.IQService
        ) {

    }

    static $inject = [
        '$http',
        '$q'
    ];

    put = ():ng.IHttpPromise<> => {
        var defer = this.$q.defer();
        if (angular.equals(this.admin, this.adminBackup)) {
            return defer.resolve();
        } else {
            this.$http({
                data: {
                    adminJSON: JSON.stringify(this.admin),
                    userJSON: JSON.stringify(this.user)
                },
                url: '/api/Config/Put',
                method: "PUT"
            })
                .success(function (data) {
                    this.adminBackup = angular.copy(this.admin);
                    this.userBackup = angular.copy(this.user)
                    return defer.resolve();
                });
        }
        return defer.promise;
    };

}

Я также создал этот интерфейс:

interface IConfigService {
     put(): ng.IHttpPromise<>;
}

Однако код дает мне ошибку:

Error   3   Cannot convert 'void' to 'ng.IHttpPromise<any>'.    

Error   4   Cannot convert 'ng.IPromise<{}>' to 'ng.IHttpPromise<any>':
    Type 'ng.IPromise<{}>' is missing property 'success' from type 'ng.IHttpPromise<any>'.  

Ответ 1

Используйте

ng.IPromise<void>

Также вы можете позволить ему неявно ввести его для вас, если вы не объявляете тип возврата и не используете этот интерфейс.

Также здесь не должно быть никакого оператора возврата:

return defer.resolve();

Просто:

defer.resolve();

Ответ 2

Когда я столкнулся с этой проблемой, я обнаружил, что не смог использовать ng.IPromise<void>, поскольку объявления для ng.IHttpPromise<> требовали вернуть объект.

Например:

public saveTechnicianNote = (jobNumber: string, technicianNote: Model.TechnicianNote): ng.IPromise<void> => {
    var data = {
        jobNumber: jobNumber,
        subject: technicianNote.subject,
        details: technicianNote.details
    };
    return this.$http.post(this.urlFactory.saveTechnicianNote, data);
}

запустила ошибку, которая Type IHttpPromise<{}> is not assignable to IPromise<void>.

Чтобы обойти это, я вернул его ng.IPromise<any>. Не 100% идеально, но это было лучшее решение, которое я мог придумать, чтобы не требовать от меня расширения angular.d.ts

Окончательный код:

public saveTechnicianNote = (jobNumber: string, technicianNote: Model.TechnicianNote): ng.IPromise<any> => {
    var data = {
        jobNumber: jobNumber,
        subject: technicianNote.subject,
        details: technicianNote.details
    };
    return this.$http.post(this.urlFactory.saveTechnicianNote, data);
}