#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 (он генерируется автоматически.