#typescript #class #tooltip
Вопрос:
Я пишу класс и пытаюсь получить возвращаемые значения во всплывающей подсказке.
import firebase from "../firebase/init";
import { DonationInterface } from "../interfaces/donation";
export class Donations {
donationsRef: firebase.firestore.CollectionReference;
// Initialize collection reference
constructor(_business_id: string) {
this.donationsRef = firebase
.firestore()
.collection(`business/${_business_id}/list`);
}
/**
* Get a list of all current donations
*
* @returns {DonationInterface[]} Array of all donations of initialized business
* @example
* const donations = Donations.list(); // => [item, item, item]
*/
async list(): Promise<DonationInterface[]> {
const snap: firebase.firestore.QuerySnapshot =
await this.donationsRef.get();
const docDataArray: DonationInterface[] = snap.docs.map(
(doc: firebase.firestore.DocumentData) => {
return doc.data();
}
);
return docDataArray;
}
}
Мне удается отображать определенные значения во всплывающей подсказке только тогда, когда я вручную заново создаю возвращаемый объект с типами для каждого значения. Если я просто верну docDataArray, всплывающая подсказка покажет только тип обещания<DonationInterface[]>.
Что я здесь делаю не так?
Комментарии:
1.Поскольку
Donations.list()
является асинхронным,Promise<DonationInterface[]>
это его возвращаемое значение. Почему вы ожидаете чего — то другого?2. Что вы делаете неправильно, так это документируете свою функцию так, как будто она возвращает массив:
@returns {DonationInterface[]}
. Это неверно. Если вы попытаетесь использовать функцию следующим образом:Donations.list().foreach(...)
вы получите сообщение об ошибке.3. @lbsn Я думаю, что меня все еще может немного смутить TS, но я ожидал бы, что всплывающая подсказка покажет внутренности DonationInterface . Так что в том же духе
Promise<{name: string, description: string }[]>
. Что касается вашего второго комментария; Каков был бы правильный способ документирования возвращаемого значения, если это обещание, которое преобразуется в массив?4. @lbsn О, я думаю, это было бы так
@returns {Promise<DonationInterface[]>}
?5. Да, это рекомендуемый способ (при условии, что вы используете JSDoc . Также есть тег @async). То, что вы называете «подсказкой», является функцией вашей среды IDE (Intellisense) и показывает сигнатуру функции, поэтому ее параметры и типы возвращаемых значений. Если вы вызовете свою функцию следующим образом:
Donations.list().then(items => { item.foreach(item => ...) })
вы обнаружите, чтоitems
у нее есть типDonationInterface[]
иitem
есть типDonationInterface
. Таким образом, Intellisense все еще в курсе реализации вашей функции.