打字稿通用模型定义stuggle

时间:2017-03-30 21:17:38

标签: typescript

在我们的Angular项目中,我们使用Typescript(2.2.2)。我在使用泛型,但我认为解决方案必须简单。

我们有一个简单的服务进行http调用:

getUsers(): Observable<any> {
  return this._service.http.get('/api/users').map(...)
}
getItems():  Observable<any> {
  return this._service.http.get('/api/items').map(...)
}

两个请求都返回具有此格式的对象(示例):

用户:

{
  count: 1,
  skip: 0,
  take: 10,
  objects: [
    { name: 'Jo', age: 24 },
    { name: 'Jane', age: 42 }
  ]
}

项目:

{
  count: 1,
  skip: 0,
  take: 10,
  objects: [
    { id: '54qds44', description: 'a great description' },
    { id: '987azex', description 'another description' }
  ]
}

我想将any类型替换为我们返回的实际精确模型。

由于我在所有回复中都有共同点,所以我想这样做:

// I could be able to use this app wide
class GenericAPIResponseList<T> = {
  count: number;
  skip: number;
  take: number;
  objects: <T[]>
};

// And special models in this particular service
class User = {
  name: string;
  age: number;
}

class Item = {
  id: string;
  description: string;
}

然后在我的服务中:

getUsers(): Observable<GenericAPIResponseList<User>>
getItems(): Observable<GenericAPIResponseList<Item>>

但对于包含通用模型的#34;通用模型而言,这种语法似乎是不正确的。

我如何编写这个&#34;通用模型接受另一个模型的列表&#34;,然后将其放在我的Observable<>返回定义中?

我读过有关接口或扩展但我有点迷失。

1 个答案:

答案 0 :(得分:1)

你明白了,但是你有一些小的语法问题:) 请尝试以下方法:

// I could be able to use this app wide

class GenericAPIResponseList<T> {
  count: number;
  skip: number;
  take: number;
  objects: T[];
}

// And special models in this particular service
class User {
  name: string;
  age: number;
}

class Item {
  id: string;
  description: string;
}

function getUsers(): Observable<GenericAPIResponseList<User>> {
    return this._service.http.get('/api/users').map(...);
}

function getItems(): Observable<GenericAPIResponseList<Item>> {
  return this._service.http.get('/api/items').map(...);
}