Редактировать: Исправлен код и добавлен TypeScript Playground example. Методы правильно набраны, вы можете проверить это, набрав ошибки ввода, попытайтесь их исправить;). Я скопировал все основные интерфейсы из файла углового определения.
Редактировать # 2: Here's the fixed version примера, приведенного выше.
Если я правильно понял ваш вопрос, вы пытаетесь определить тип возврата для метода службы, заявляя, что он возвращает обещание, результатом которого при разрешении будет определенный объект?
В этом случае вы почти там, я разделил ваши два примера методов в отдельных блоках, так как они требуют другого подхода.
В общем случае я удалил область копирования (self = this
), поскольку вы используете методы толстой стрелки, которые автоматически будут обладать методом внешней лексической области. Короче говоря, нет необходимости делать копию области, и на самом деле, в вашем примере self не всегда указывает на службу (поскольку вы копируете область внутри метода, а не за ее пределами).
Кроме того, обратите внимание на определение углового обещания (усеченного):
interface IDeferred<T> {
resolve(value?: T): void;
reject(reason?: any): void;
}
Как таковые, набрав угловую Promise только добавить типизации для решимости случая обещания, а не для отклоненный случай. Следовательно, при вызове вашей службы он проверяет, что результат в обработчике успеха имеет тип, который вы определили, но тип параметров в обработчике ошибок имеет тип any
.
topicTest
Для этого метода для работы нужно вводить $q
в вашу службу, а затем использовать его, чтобы создать свой собственный deferred
topicTest =(): IPromise<Foo> => { // return a promise which will result in a parameter of MyType upon resolving
var deferred = this.$q.defer<Foo>(); // Type the deferred to get better 'intellisense' support
if (this.abc = 99) {
deferred.resolve(new Foo());
}
if (this.abc = 88) {
deferred.reject("You can pass in whatever you like to the reject case");
}
return deferred.promise;
};
topicNewSubmit
$http
уже возвращает обещания, так вам нужно всего лишь подключить их, установив обратный вызов then
и , возвращая из этого метода t o разрешить соединение других then
callabacks к нему.
В этом случае возвращаемый тип вашего метода обслуживания будет angular.IPromise<() => any>
, где вы можете заменить any
на тип, который вам нужен. Возвращаемый тип метода then
должен соответствовать любому типу, который вы выбрали для общего заполнителя в возвращаемом типе метода обслуживания.
topicNewSubmit =() : IPromise<Foo> => {
return this.$http({ url: this.url, method: "GET" }).then((response): Foo => {
return new Foo();
}, (error) => {
return "whatever you'd like, it does not have to correspond to Foo";
});
}
Вы могли бы затем использовать сервис как
MyService.topicNewSubmit().then((data) => {
// data needs to be of type T, where T is the type you defined in the generic placeholder of IPromise<T>
}, (error: any) => {
// In the error case, the parameters are of type any
});
https://docs.angularjs.org/api/ng/service/$q#resolve '$ q' имеет' resolve' метод. Если вы используете более раннюю версию Angular, используйте '.when'. Они делают то же самое. Кроме того, методы $ http' уже возвращают обещания. Вам не нужно использовать внутреннюю цепочку обещаний. –
@ExplosionPills - Если у вас есть несколько минут, вы можете добавить свои комментарии в качестве ответа на мой пример с коротким кодом. Я не совсем уверен, что вы подразумеваете под «$ http methods, которые уже дают обещания. Вам не нужно будет использовать другую цепочку обещаний». Одна вещь, которую я видел из моего тестирования, и причина, по которой я добавил себя. $ Q.reject заключался в том, что если бы я обработал отклонение без возврата туда, то моя темаNewSubmit всегда возвращалась бы хорошо. Надеюсь, это имеет смысл. Большое спасибо. –
Я советую вам заставить его работать с обычным javascript, а затем переносить его на машинопись, а не на то, чтобы портировать его на машинопись очень сложно ... если вы знаете машинопись, тогда это должно быть легко. –