打字稿:订阅或地图中的投射类型

时间:2016-09-05 09:24:18

标签: angular typescript

我从后端收到一个包含SELECT '[', lpad(ABS(Balance),18,0) ,']', '[' || lpad(ABS(Balance),18,0) || ']' FROM Accounts 对象数组的json: 这是客户端类:

client

我正在寻找将收到的export class Client { private id:number; private firstname: String; private lastname: String; private phone:String; private address:String; private country:String; private Security_No:String; } 投放到json的最简单方法。 目前我将json存储在属性中,稍后我将其抛出并提取数据。但似乎应该有一种更简单的方法吗?

Clients[]

2 个答案:

答案 0 :(得分:4)

您无法将json数据(即js对象)转换为类 好吧,你可以,但是你没有真正拥有类的实例,而是满足类接口的对象。

简单示例:

class Point {
    x: number;
    y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }
}

let a = {
    x: 5,
    y: 5
} as Point;
console.log(a); // Object {x: 5, y: 5}

let b = new Point(5, 5);
console.log(b); // Point {x: 5, y: 5}

编译器不会抱怨a不是Point的实例,因为它满足Point接口,所以这些是有效的:

function log(point: Point) {
    console.log(`(${ point.x }, ${ point.y })`);
}

log(a); // fine
log(b); // fine

code in playground

它有效this way because

  

TypeScript的核心原则之一是类型检查的重点   价值观的形状。这有时被称为“鸭子打字”或   “结构子类型”。在TypeScript中,接口充当了角色   命名这些类型,是定义合同的有效方式   在您的代码中以及与您之外的代码签订的合同   项目

More on duck typing

至于您的具体问题,您可以将您的类用作界面或只是将其变为界面:

interface Client {
    id:number;
    firstname: String;
    lastname: String;
    phone:String;
    address:String;
    country:String;
    Security_No:String;
}

然后(在两种情况下):

this._httpClientService.getAllClients().subscribe((res) => {
    this.data = res.json() as Client[]
}));

但是如果你要使用你的类(而不是界面)那么属性必须是公共的而不是私有的。

如果您希望将您的课程用作课程而不是界面,则无需投射,您需要:

this._httpClientService.getAllClients().subscribe((res) => {
    this.data = res.json().map(item => new Client(data));
}));

你需要有Client的构造函数,它接受接口并将值赋给其成员。

答案 1 :(得分:2)

在我的应用程序中,我有一个用户对象,它有许多字段和许多数组来存储数据,因此它是一个复杂的对象。在map运算符中,我可以将response.json()强制转换为该值:

return this.http.get(this.constants.userUrl + userId, { headers: headers })
      .map((response: Response) => <User>response.json())
      .catch(this.handleError);
  }

订阅的处理方式相同: