首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有角HTTP的类型可观测值

带有角HTTP的类型可观测值
EN

Stack Overflow用户
提问于 2017-05-24 14:14:58
回答 2查看 1.6K关注 0票数 0

short:有一个返回http调用的方法(get,put,不管怎样),使用类型记录类型确定返回的项目的类型?

在TypeScrpt级别上,许诺是一种泛型类型。它继承您所期望的消息的类型,例如IPromise<T>。通过这种方式,您可以定义一个方法返回一个类型为Promise<number[]>的承诺,它基本上返回一个使用数字列表解析的承诺。多亏了这一点,你才能使打字稿更加强大。

您也可以对可观察性(RxJS)做同样的操作。简单地说,我们有Observable<T> (只需看看npm:rxjs中的Observable.d.ts )。您在这个流中所期望的每一项都是T类型的(这是subscribe回调参数-必须是- TypeScript为您检查这个参数)。

角度

回到角度,HTTP模块封装可观察到的内容。它不会立即返回值,但是会发出带有http相关内容(状态、状态文本、url等)的HTTP调用,而不仅仅是值。在HTTP的.d.ts、http.get、put、post等中,返回Observable<Response>,其中Response是HTTP调用的角度内置包装器。但是我发现我失去了预先定义HTTP应该返回的类型的可能性。

问题是:角http调用是否有可能预先定义http-调用/可观测返回的类型?类似于Observable<User>User只是我的应用程序接口。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-24 14:25:08

我想你是在找这样的东西:

代码语言:javascript
运行
复制
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/map';
import 'rxjs/add/observable/of';

get(id: number): Observable<User> {
    const url = `${this.baseUrl}/${id}`;

    return this.http
               .get(url)
               .do((response: Response) => {
                 if (!response) {
                   return Observable.of(null);
                 }
               })
               .map((response: Response) => {
                   return <User>response.json();
               })
               .catch(error => {
                 return Observable.of(null);
               });
}
票数 2
EN

Stack Overflow用户

发布于 2017-05-24 14:38:25

也许这能帮到某人..。

代码语言:javascript
运行
复制
@Injectable()
export class UsersModel {
  getItem(id: number): Observable<User> {
    return this.http.get(`${API_URL}/users/${id}`, {
      headers: this.getHeaders()
    });
  }
}

在上面的代码中,引发的错误是Observable<Response>与不同的数据类型Observable<User>冲突。解决方案只是将observable.map((res) => res.json())包含到DAO方法中,如下所示:

代码语言:javascript
运行
复制
@Injectable()
export class UsersModel {
  getItem(id: number): Observable<User> {
    return this.http.get(`${API_URL}/users/${id}`, {
      headers: this.getHeaders()
    })
    .map((res) => res.json());
  }
}

现在没有冲突,因为res.json (类响应)返回any。这为我们打开了使getItem方法返回我们的某些类型的可能性:getItem(id: number): Observable<User>。我已经得到了我所需要的--在DAO之外--在一个组件中,例如,我需要:

代码语言:javascript
运行
复制
this.UsersModel.getItem().subscribe(u => {
  u // u is of User already, yay!
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44161007

复制
相关文章

相似问题

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