首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Typescript中函数的泛型返回类型

Typescript中函数的泛型返回类型
EN

Stack Overflow用户
提问于 2016-05-23 16:35:34
回答 3查看 21.2K关注 0票数 12

我刚接触ts,但我已经学到了一些java中泛型的概念。查询是我有三个函数: searchTrack、searchAlbum、searchArtist

代码语言:javascript
运行
复制
  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‘,它接受查询和实体的类型,并返回一个特定实体类型的集合的可观察值。我被困在这里了。如何使用泛型来指定函数的泛型返回类型。

代码语言:javascript
运行
复制
search(query: string, type: string): Observable<Array<T>> {
 return this.query(`/search`, [
   `q=${query}`,
   `type=${type}`
 ]);
}

我有什么方法可以做到这一点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-23 16:39:37

尝试使用数组类而不是[]。还要在搜索函数上定义一个泛型T类型。

代码语言:javascript
运行
复制
search<T>(query: string, type: string): Observable<Array<T>> {
 return this.query(`/search`, [
   `q=${query}`,
   `type=${type}`
 ]);
}

你应该可以这样叫它:

代码语言:javascript
运行
复制
let result = search<Artist>('someQuery', 'artist');

你可以在here手册的泛型一章中找到更多关于typescript中泛型的信息。

票数 15
EN

Stack Overflow用户

发布于 2016-05-23 16:51:16

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

代码语言:javascript
运行
复制
myObj.search<Track>(query, "track");

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2016-06-16 03:14:03

您可以使用重载来完成此操作:

代码语言:javascript
运行
复制
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;
    }
}

这将为您提供正确的类型:

代码语言:javascript
运行
复制
var observable = x.search("test", "Track");

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

代码语言:javascript
运行
复制
var observableError: Observable<Album[]> = x.search("test", "Track");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37386265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档