我是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}`
]);
}
有什么方法可以实现这个目标吗?
答案 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");