Показывать возвращаемые значения метода машинописи при использовании интерфейса

#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 все еще в курсе реализации вашей функции.