Typescript: указание правильного типа возвращаемого значения для разрешаемых параметров в promises

#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. На скриншоте 1 элемент подсказки не говорит, что typeof результатом является number , но при печати этого в console.log , он говорит, что это number . В чем разница?
  2. Если в консоли выводится, что это 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) => {