typescript, каков тип нового объекта Promise?

#javascript #typescript #types #promise

#javascript #typescript #типы #обещание

Вопрос:

В TS у меня есть функция, подобная:

 function a() : FOO {
  return new Promise((resolve, reject) => {
    //omitted
  })
}
  

Какой правильный тип для записи FOO ?
Хорошо ли просто сказать Promise<any> ?

Возможно, полезно показать более подробную информацию о том, что я возвращаю в функции a :

 new Promise((resolve, reject) => {
    const cmd = spawn(str, null, { shell: true });

    cmd.stdout.on("data", (data) => {
        //just logging
    });

    cmd.stderr.on("data", (data) => {
      return reject(data);
    });

    cmd.on("error", (error) => {
      return reject(error);
    });

    cmd.on("close", (code) => {
      return resolve(code);
    });
  });
  

Комментарии:

1. К чему относится обещание?

2. @evolutionxbox: слезы и разочарование, как и большинство обещаний 😀

3. Promise<Tears|Disappointment> ? 😉

4. @evolutionxbox — Возможно, даже Promise<Tears amp; Disappointment> . Я имею в виду, что сейчас 2020 год … 😉

Ответ №1:

Это полностью зависит от того, какого типа будет значение выполнения обещания. Например, если обещание будет выполнено с помощью a number , тогда тип будет Promise<number> . Например:

 function a() : Promise<number> {
    return new Promise((resolve, reject) => {
        doSomeCallbackBasedThing((err: Error | null, result: number) => {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }
        });
    })
}
  

Если он выполняется с undefined помощью via resolve() без аргумента, обычно вы пишете Promise<void> .

Часто вам вообще не нужно явно указывать тип; TypeScript часто может вывести его из кода в функции.


Повторное редактирование: вы бы использовали Promise<x> where x — тип code параметра, который вы получаете в своем обработчике для close события.