Returnere et løfte fra AngularJS $q med TypeScript


Jeg har en tjeneste som pakker inn $http med mine funksjoner som returnerer et utsett objekt.

Mitt grensesnitt:

export interface MyServiceScope {
    get: ng.IPromise<{}>;
}

Min klasse:

export class MyService implements MyServiceScope {

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

    constructor(private $http: ng.IHttpService,
                private $log: ng.ILogService,
                private $q: ng.IQService) {
        this.$http = $http;
        this.$log = $log;
        this.$q = $q;
    }

    get(): ng.IPromise<{}> {
        var self = this;
        var deferred = this.$q.defer();

        this.$http.get('http://localhost:8000/tags').then(
            function(response) {
                deferred.resolve(response.data);
            },
            function(errors) {
                self.$log.debug(errors);
                deferred.reject(errors.data);
            }
        );

        return deferred.promise;
    }
}

Kompileringen mislykkes med følgende feil:

myservice.ts(10,18): error TS2420: Class 'MyService' incorrectly implements interface 'MyServiceScope'.
    Types of property 'get' are incompatible.
        Type '() => IPromise<{}>' is not assignable to type 'IPromise<{}>'.
            Property 'then' is missing in type '() => IPromise<{}>'.

For referanse, her er IPromise-definisjonen fra DefinitelyTyped. IQService.defer()-kallet returnerer et IDeferred-objekt, og deretter returnerer deferred.promise et IPromise-objekt.

Jeg er ikke sikker på om jeg bruker feil definisjoner i grensesnittet mitt, eller om jeg ikke returnerer det utsatte objektet på samme måte. Enhver tilbakemelding vil bli høyt verdsatt!

Svar #1

I grensesnittet ditt definerte du en egenskap get, og i tjenesteimplementeringen er det en funksjon get(). Det du sannsynligvis ønsker, er en funksjon, så grensesnittet bør være:

export interface MyServiceScope {
    get(): ng.IPromise<{}>;
}

Relaterte artikler