首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用Object.assign

通用Object.assign
EN

Stack Overflow用户
提问于 2018-03-10 01:53:45
回答 1查看 1.8K关注 0票数 5

场景

我知道从API调用返回的数据的形状,我希望它通过一个TypeScript类具有一些扩展功能。我已经知道,为了满足这一要求,我可以做以下工作:

代码语言:javascript
复制
this.http
    .get(url)
    .map((res: Response) => {
        return res.json().map((obj: Type) => {
            return Object.assign(new Type(), obj);
        });
    })
    // And so on  

是否有可能使这方面的一般实现类似于以下内容:

代码语言:javascript
复制
get<T>(url: string): Observable<T> {
    return this.http
        .get(url)
        .map((res: Response) => {
            return res.json().map((obj: T) => {
                return Object.assign(new T(), obj); // not sure how to approach this
            });
        });
}   

上面的方法可以返回一个直接向上的JavaScript对象,但是我不确定如何在泛型类型上运行赋值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-10 03:06:00

我能够通过为新的泛型类型创建一个工厂类来使它工作。如果其他人能提出更好的替代方案,我将把它作为答案。

我所做的是:

factory.ts

代码语言:javascript
复制
export class Factory<T> {
  constructor(private type: new () => T) { }

  getNew(): T {
    return new this.type();
  }
}  

app.service.ts

代码语言:javascript
复制
@Injectable()
export class AppService {
  users = new BehaviorSubject<User[]>([]);

  constructor(public http: Http) { }

  getUsers() {
    const userFactory = new Factory<User>(User);    
    this.http.get('https://jsonplaceholder.typicode.com/users')
      .map((res: Response) => this.extractGeneric<User>(res, userFactory))
      .catch(this.handleError)
      .subscribe(
        data => this.users.next(data),
        err => console.log(err)
      )
  }

  extractGeneric<T>(res: Response, factory: Factory<T>) {
    return res.json().map((obj: T) => {
      return Object.assign(factory.getNew(), obj);
    });
  }  

  handleError(error: Response | any) {
    let errMsg: string;    
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body.error || body.Message || JSON.stringify(body);
      errMsg = `${err}`;
    } else {
      errMsg = error.message ? error.message : error.toString();
    }    
    console.error(errMsg);
    return Observable.throw(errMsg);
  }
}

请参阅StackBlitz上的这个项目

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49204568

复制
相关文章

相似问题

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