首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typescript类型安全服务不返回指定的类对象

Typescript类型安全服务不返回指定的类对象
EN

Stack Overflow用户
提问于 2019-11-02 00:04:30
回答 2查看 93关注 0票数 1

很简单的问题。服务代码如下:

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { User } from './user';

@Injectable()
export class UserService {
   private _url = "https://jsonplaceholder.typicode.com/users";

   constructor(private _httpClient: HttpClient) {
   }

   getUser(id: string){
      return this._httpClient.get<User>(this._url + '/' + id);
   }
}

正如我所期望的,getUser方法返回用户的可观察性。

我想在组件中获取User对象,如下所示:

{ id: 1,姓名:"a",电话:"b",邮箱:"c",地址:{street:"d",套间:"e",城市:"f",邮政编码:"g"} }

这是user.ts代码。

代码语言:javascript
复制
export class Address {
   street: string;
   suite: string;
   city: string;
   zipcode: string;    
}

export class User {
   id: number;
   name: string;
   phone: string;
   email: string; 
   address = new Address();
}

当我从组件调用服务时,我从jsonplaceholder获取整个用户对象,而不是从我的user.ts代码获取用户对象。我的组件代码:

代码语言:javascript
复制
import { Component, OnInit } from '@angular/core';
import { UserService } from './user.service';
import { Router, ActivatedRoute } from '@angular/router';

@Component({
   selector: 'newuserform',
   templateUrl: './newuser-form.component.html',
   providers: [UserService]
})
export class NewUserFormComponent implements OnInit {
constructor(
   private _service: UserService, 
   private _router: Router,
   private _route: ActivatedRoute) { }

 ngOnInit(){
    let id = this._route.snapshot.paramMap.get('id');
    this._service.getUser(id)
       .subscribe(
          user => console.log(user);
       );
 }
 }
EN

回答 2

Stack Overflow用户

发布于 2019-11-02 02:18:00

Typescript类型安全服务不返回指定的类对象

..。你误解了这是什么意思。您当前在代码中所说的,只是告诉编译器,您期望http-request返回的内容将符合您创建的模型。对此没有运行时检查。这只是为了在你编写代码时帮助你,因为编译器可以告诉你什么时候你正在做一些不符合你的模型的事情。这将使您的调试变得更容易。

所以你需要手动设置你想要的属性。或者通过编写一个函数来为您完成此操作,或者像我在map中所做的那样。而且,就像在其他答案中一样,如果没有特定于类的方法,我将使用接口。

如上所述,您需要设置所需的属性。在这里,我很懒,使用any作为http-request的返回类型,因为您不能使用User,因为这不是您从http-request获得的。不过,您将转换响应以返回User

代码语言:javascript
复制
  getUser(id: string): Observable<User> {
    return this._httpClient.get<any>(this._url + "/" + id).pipe(
      map((user: any) => {
        return {
          id: user.id,
          name: user.name,
          phone: user.phone,
          email: user.email,
          address: {
            street: user.address.street,
            suite: user.address.suite,
            city: user.address.city,
            zipcode: user.address.zipcode
          } as Address
        } as User
      })
    );
  }
}

在这种情况下,您还可以删除不需要的属性:

代码语言:javascript
复制
getUser(id: string): Observable<User> {
  return this._httpClient.get<any>(this._url + "/" + id).pipe(
    map((user: any) => {
      delete user.company;
      delete user.address.geo;
      delete user.website;
      return user as User;
    })
  );
}

两个选项均为。

还可以阅读有关和的文档

票数 1
EN

Stack Overflow用户

发布于 2019-11-02 00:38:41

您不能限制服务器响应。试试这个:

服务:

代码语言:javascript
复制
getUser(id: string): User {
    const user = this._httpClient.get(this._url + '/' + id);
    return {
        id: user.id,
        name: user.name,
        phone: user.phone,
        email: user.email,
        address: {
            street: user.address.street,
            suite: user.address.suite,
            city: user.address.city,
            zipcode: user.address.zipcode
        }
    };
}

解释:const user是从jsonplaceholder返回的整个对象。return转换响应以满足您的需求。

您应该将UserAddress定义为接口,而不是类。

代码语言:javascript
复制
export interface Address {
   street: string;
   suite: string;
   city: string;
   zipcode: string;    
}

export interface User {
   id: number;
   name: string;
   phone: string;
   email: string; 
   address: Address;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58662333

复制
相关文章

相似问题

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