#javascript #typescript
#javascript #typescript
Вопрос:
Вчера я решил поиграть с typescript и попытался перенести некоторые базовые образцы javascript promise в typescript promises. Но во время переноса примеров я столкнулся с проблемой, которую все еще не мог решить. Пытался погуглить, но тоже бесполезно.
Сценарий: У меня действительно есть функция, которая возвращает a, Promise
которая при выполнении преобразуется в a number
. Я также хотел протестировать некоторые then
сценарии и на этом примере.
Пожалуйста, ознакомьтесь с примером кода ниже:
function test_promise(): Promise<number>{
return new Promise((resolve, reject) :number => {
let result:number = 10;
resolve(result);
}).then(result => { // first then
console.log("Result: " (typeof result)); // Result: number
return result * 2; //
}).then(result => { // second then
return result * 2;
}).then(result => { // third then
return result * 2;
});
}
Я также добавляю два скриншота для большей наглядности.
Снимок экрана 1:
Снимок экрана 2
Есть пара вещей, которые на данный момент мне не ясны:
- На скриншоте 1 элемент подсказки не говорит, что
typeof
результатом являетсяnumber
, но при печати этого вconsole.log
, он говорит, что этоnumber
. В чем разница? - Если в консоли выводится, что это
number
, то почему это не позволяет мне выполнить операцию умножения над этим.
Что мне нужно изменить здесь, чтобы заставить этот пример работать?
Ребята, пожалуйста, не могли бы вы пролить на это немного света. Спасибо.
С уважением,
Ответ №1:
Решение здесь состоит в том, чтобы явно указать тип значения первого Promise
объекта, который вы создаете, путем добавления <number>
непосредственно после new Promise
, как показано:
/* Add <number> after new Promise */
return new Promise<number>((resolve, reject) => {
let result:number = 10;
resolve(result);
}).then(result => { // first then
console.log("Result: " (typeof result)); // Result: number
return result * 2; //
}).then(result => { // second then
return result * 2;
}).then(result => { // third then
return result * 2;
});
Выполнение этого информирует Typescript о типе значения первого promises, что позволяет определить тип значения последующих promises в цепочке.
Это, в свою очередь, решит вашу проблему. Более подробную информацию о обобщенных файлах в Typescript можно найти здесь. Надеюсь, это поможет!
Ответ №2:
Проверьте следующую строку:
return new Promise((resolve, reject) :number => {
: number
означает, что функция (или конструктор, что имеет еще меньше смысла) возвращает число. Это неправда! new Promise
очевидно, что возвращается обещание, и вам не нужно его указывать.
Возможно, вы хотели сказать, что тип, обрабатываемый Promise, является числом. Вы можете сделать это с помощью угловых круглых скобок:
return new Promise<number>((resolve, reject) => {