Typescript: универсальный тип для вложенных функций - PullRequest
0 голосов
/ 05 декабря 2018

Я искал ответы на эту проблему, но не могу правильно их реализовать.Может быть, вы можете сказать мне правильный путь.

Я объясню: я хочу использовать дженерики машинописи, чтобы больше не использовать «Any» в моих методах.

Я пишу код ичто я хотел бы сделать.

В КОМПОНЕНТЕ:

this.DatabaseService.getCollection <IUser> ('users', 'lastname'). subscribe (loadData =>
{
    this.listUser = loadData;
});

, когда я вызываю getCollection (), я буду вызывать следующие вложенные методы:

  • getCollectionSnapshot ()
  • getCollectionRef ()

Я хочу, чтобы тип (IUser), переданный в getCollection (), был перенаправлен нитидифицированным методам до достижения getCollectionRef () получение возвратной коллекции этого типа: collection

FILE SERVICE: database.service.ts

getCollection <T> (path: string, sortBy ?: string): Observable <T []>
{
    // >>>how do I pass the type (T) to getCollectionSnapshot() ? 

    return this.getCollectionSnapshot (path, sortBy) .pipe (
    map (changes =>
    {
        return changes.map (change =>
        {
            const data = change.payload.doc.data ();
            const id = change.payload.doc.id;
            return {id, ... data};
        });
     }
     ));
}


getCollectionSnapshot (path: string, sortBy ?: string): Observable <any []>
{
    return this.getCollectionRef (path, sortBy) .snapshotChanges ();
}



getCollectionRef (path: string, sortBy ?: string): AngularFirestoreCollection
{
    if (sortBy === undefined)
    {
      return this.afs.collection (path);
    }
    else
    {
      return this.afs.collection (path, ref => ref.orderBy (sortBy));
    }
}

Спасибо!Я надеюсь восполнить пробел в дженериках

1 Ответ

0 голосов
/ 05 декабря 2018

Я не уверен, понимаю ли я вашу проблему.Вы хотите передать параметр типа, заданный для метода getCollection , методам, вызываемым в getCollection .Если это так, это подойдет вам:

getCollection <T> (path: string, sortBy ?: string): Observable <T []>
{ 

    return this.getCollectionSnapshot<T> (path, sortBy) .pipe (
    map (changes =>
    {
        return changes.map (change =>
        {
            const data = change.payload.doc.data ();
            const id = change.payload.doc.id;
            return {id, ... data};
        });
     }
     ));
}


getCollectionSnapshot<T> (path: string, sortBy ?: string): Observable <any []>
{
    return this.getCollectionRef<T> (path, sortBy) .snapshotChanges ();
}

getCollectionRef<T> (path: string, sortBy ?: string): AngularFirestoreCollection
{
    if (sortBy === undefined)
    {
         return this.afs.collection (path);
    }
    else
    {
         return this.afs.collection (path, ref => ref.orderBy (sortBy));
    }
} 

обратите внимание на изменения:

getCollectionSnapshot (...

getCollectionRef (...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...