我刚接触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');
}我想在这个类中有一个通用的函数'search‘,它接受查询和实体的类型,并返回一个特定实体类型的集合的可观察值。我被困在这里了。如何使用泛型来指定函数的泛型返回类型。
search(query: string, type: string): Observable<Array<T>> {
return this.query(`/search`, [
`q=${query}`,
`type=${type}`
]);
}我有什么方法可以做到这一点吗?
发布于 2016-05-23 16:39:37
尝试使用数组类而不是[]。还要在搜索函数上定义一个泛型T类型。
search<T>(query: string, type: string): Observable<Array<T>> {
return this.query(`/search`, [
`q=${query}`,
`type=${type}`
]);
}你应该可以这样叫它:
let result = search<Artist>('someQuery', 'artist');你可以在here手册的泛型一章中找到更多关于typescript中泛型的信息。
发布于 2016-05-23 16:51:16
正如@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是什么。
发布于 2016-06-16 03:14:03
您可以使用重载来完成此操作:
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");https://stackoverflow.com/questions/37386265
复制相似问题