Вот некоторый код (упрощенный), чтобы лучше понять:
Оболочка для отправки запросов
- Он выполняет некоторые общие действия при отправке запроса и при его завершении.
- Возвращает результат запроса (обработчик).
async function request (handler) {
// common stuff
try {
const result = await handler()
return result || true
}
catch (err) {
doSomethingWithError(err)
return err
}
finally {
// common stuff
}
}
/**
* Imagine a simple service / api client
*/
const someApiClient = {
/**
* @returns {Promise<string[]>} 3 first letters
*/
async getSomeData () {
return ['a', 'b', 'c']
}
}
/**
* Just a function or method using the api client, that has types declared
*/
async function fetchMeSomeDataHandler () {
return someApiClient.getSomeData()
}
const result = await request(() => fetchMeSomeDataHandler())
Ожидал
Здесь я ожидаю, что vscode / jsdoc сделает вывод, что тип результата — строка [] и даже даст мне описание от клиента API (3 первые буквы).
Но это не так, он даст тип any
в конце.
Что мы получаем в vscode
Если мы проследим за типами, подобранными vscode, мы увидим, что он постепенно теряет типы, пока ничего не останется.
- Полное описание типа подобрано для клиента API.
- Тип известен в определении обработчика, но мы потеряли описание клиентского значения (3 первые буквы).
- Мы полностью потеряли информацию о типе для окончательного результата