Typescript中的泛型函数返回类型

时间:2016-05-23 08:35:34

标签: function generics typescript

我是ts的新手,但我已经了解了一些关于java中泛型的概念。查询是我有三个函数:searchTrack,searchAlbum,searchArtist

  searchTrack(query: string): Observable<Track[]> {
    return this.search(query, 'track');
  }

  searchArtist(query: string): Observable<Artist[]> {
    return this.search(query, 'artist');
  }

  searchAlbum(query: string): Observable<Album[]> {
    return this.search(query, 'album');
  }

我想要一个通用功能&#39;搜索&#39;在此类中,它接受查询和实体类型,并返回特定实体类型的集合的Observable。我被困在这里。如何使用泛型来指定函数的泛型返回类型。

search(query: string, type: string): Observable<Array<T>> {
 return this.query(`/search`, [
   `q=${query}`,
   `type=${type}`
 ]);
}

有什么方法可以实现这个目标吗?

3 个答案:

答案 0 :(得分:5)

尝试使用数组类而不是[]。 还要在搜索功能上定义通用T类型。

           0 1 1 0 0 0

您应该可以这样称呼它:

search<T>(query: string, type: string): Observable<Array<T>> {
 return this.query(`/search`, [
   `q=${query}`,
   `type=${type}`
 ]);
}

您可以在手册here的“泛型”一章中找到有关打字稿中泛型的更多信息。

答案 1 :(得分:2)

正如@toskv回答的那样,您可以在方法签名中添加泛型类型,但编译器无法推断出类型,因此您必须添加它:

myObj.search<Track>(query, "track");

但是,您可以执行以下操作:

interface MyObservableClass {}

interface MyObservableClassCtor<T extends MyObservableClass> {
    new (): T;
    getType(): string;
}

class Artist implements MyObservableClass {
    static getType(): string {
        return "artist";
    }
}

class Album implements MyObservableClass {
    static getType(): string {
        return "album";
    }
}

class Track implements MyObservableClass {
    static getType(): string {
        return "track";
    }
}

class Searcher {
    search<T extends MyObservableClass>(ctor: MyObservableClassCtor<T>, query: string): Observable<T[]> {
        return this.query(`/search`, [
            `q=${query}`,
            `type=${ ctor.getType() }`
        ]);
    }
}

let searcher: Searcher = ...;

searcher.search(Track, "...");

然后编译器可以通过提供类(/ ctor)来推断T是什么。

答案 2 :(得分:0)

你可以通过重载来实现:

class A {
    search<T>(query: string, type: "Track"): Observable<Track[]>;
    search<T>(query: string, type: "Artist"): Observable<Artist[]>;
    search<T>(query: string, type: "Album"): Observable<Album[]>;
    search<T>(query: string, type: string): Observable<T[]>;
    search<T>(query: string, type: string): Observable<T[]> {
        return null;
    }
}

哪个会给你正确的类型:

var observable = x.search("test", "Track");

这会在不兼容的对象上产生编译错误:

var observableError: Observable<Album[]> = x.search("test", "Track");
相关问题