首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较TypeScript中的泛型类型

比较TypeScript中的泛型类型
EN

Stack Overflow用户
提问于 2022-09-08 13:27:41
回答 2查看 44关注 0票数 0

我正在为我的公司做一个前端项目,在这个项目中,我们从API中查询不同的对象(比如用户、产品等等)。

我目前正试图概括我们的服务,这些服务处理组件和API之间的数据传输,因为它们几乎都是这样做的(试图保持它的干燥状态)。为了实现这一点,我需要根据泛型的类型进行不同的API调用。

基本上可以归结为:

代码语言:javascript
复制
public foo<TMyType>(){
        if (TMyType === TypeA) {
            //do stuff
        } else if (TMyType === TypeB) {
            //do other stuff
        } else {
            throw new Error('Invalid type');
        }
    }

注意,我不想传递实际的对象,而只是根据调用函数的泛型类型来决定要做什么。我觉得应该有一个很简单的方法来实现这一点,但我想不出来。

非常感谢

EN

回答 2

Stack Overflow用户

发布于 2022-09-08 13:49:28

不能在运行时进行类型比较,但可以这样做:

代码语言:javascript
复制
function foo<T extends TypeA | TypeB>(a: T) {
    
}

T extends TypeA | TypeB意味着泛型T只能是TypeATypeB

要将typeA与typeB区分开来,您必须找到一个可以区分它们的特定属性

例如:

代码语言:javascript
复制
type TypeA = string
type TypeB = { test: string }

function foo<T extends TypeA | TypeB>(a: T) {
    if(typeof a === "string") {
         //... a is TypeA
    } else if("test" in a) {
         //... a is TypeB
    }
}
票数 0
EN

Stack Overflow用户

发布于 2022-09-08 13:55:22

您可以删除一些具有类继承的样板。

代码语言:javascript
复制
class GenericRestService {
     protected endpoint: string = '/stuff';

     constructor(protected httpClient: HttpClient) {}

     makeACall<T>(param: string): Observable<T> {
          return this.httpClient.get<T>(`${this.endpoint}/${param}`)
               .pipe( 
          // some stuff here
               ); 
     }
}
代码语言:javascript
复制
class SpecificRestService extends GenericRestService {
    endpoint = '/otherThings';
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73649842

复制
相关文章

相似问题

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