VSCode JSDoc обещания

#javascript #visual-studio-code #jsdoc

#javascript #visual-studio-code #jsdoc

Вопрос:

 const promise = new Promise((resolve) => {
    resolve('string');
});
  

Тип переменной «promise» Promise<any> равен , в то время как он должен быть Promise<string> . Могу ли я заставить его автоматически распознавать, что вводится в resolve()? Я мог бы вручную описать тип в docblock, но в resolve() помещается довольно сложный объект, и мне бы просто хотелось, чтобы он использовал автоматически сгенерированный документ.

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

1. Если вам просто нужно обещание значения, для этой цели в конструкторе Promise есть статический метод : const foo = Promise.resolve("some string"); . Его использование может упростить или не упростить статический анализ.

Ответ №1:

Я не думаю, что вам нужно автоматически узнавать, что вы вкладываете в resolve, если у вас нет помощника в этом обещании.

Вы можете создавать свои «собственные типы» и передавать их в Promise следующим образом : D

 /**
 * @typedef {{name: "John", lastName: "Doe", age: "infinite"}} MyComplicatedObject
 * @type {Promise<MyComplicatedObject>}
 */
const promise = new Promise(resolve => {
    resolve({ name: 'John', lastName: 'Doe', age: 'infinite' });
});
  

Вам не нужно вводить их повторно, и вы также можете import использовать их в аннотации jsdoc из других файлов, точно так же, как вы импортируете любой другой файл из js.

Если вы хотите автоматически определять, какое разрешение будет разрешено, у вас есть помощник для этого обещания:

 /**
 * @template resT
 * @param {resT} whatToResolve
 * @returns {Promise<resT>}
 */
const myPromise = whatToResolve => {
    return new Promise(resolve => {
        resolve(whatToResolve);
    });
};

  

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

1. Спасибо за ваш ответ. На самом деле мой вариант использования заключается в том, что я вызываю какой-то внешний метод и хочу разрешить обещание с его помощью. const promise = new Promise((resolve) => { resolve(MyClass.method()); }); . Как бы мне заставить VSCode правильно отображать, что «обещание» имеет тип Promise<{...}> , а не Promise<any> . К MyClass.method() прикреплен соответствующий JSDoc (он генерируется автоматически.