我从远程REST服务器读取了一个JSON对象.此JSON对象具有typescript类的所有属性(按设计).如何将收到的JSON对象强制转换为类型var?
我不想填充一个typescript var(即有一个带有这个JSON对象的构造函数).它很大并且通过属性按子对象和属性跨子对象复制所有内容将花费大量时间.
更新:您可以将其转换为打字稿界面!
当使用AJAX时,我倾向于以JSON对象(又称Javascript)的形式将对象从我的服务器传递给Javascript.我的Javascript中的某些函数依赖于我正在使用的特定类型的对象.例如,让我们使用电话号码.我有一个构造函数:
function PhoneNumber(number, type, isPrimary, contactId, id, className) {
this.number = number;
this.type = type;
this.isPrimary = isPrimary;
this.contactId = contactId;
this.id = id;
this.className = className;
}
Run Code Online (Sandbox Code Playgroud)
在我的Javascript中创建电话号码对象时使用的.在某些情况下,我不在JS中创建对象,我从服务器获取对象,因此它以具有完全相同字段的通用对象的形式出现.因此,当我的代码依赖于特定类型时,使用如下内容:
var objType = objArray[i].constructor.name;
var mappedObj;
switch(objType) {
case 'PhoneNumber':
currentArray = currentArray.phone;
//Convert response to javascript object.
mappedObj = mapPhone(jsonResponse[i]);
break;
case 'Email':
currentArray = currentArray.email;
mappedObj = mapEmail(jsonResponse[i]);
break;
case 'Address':
currentArray = currentArray.address;
mappedObj = mapAddress(jsonResponse[i]);
break;
case 'Website':
currentArray = currentArray.website;
mappedObj = mapWebsite(jsonResponse[i]);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我检查对象构造函数的名称,并根据该名称设置某些变量.如果我检查名称的对象是来自服务器的JSON,它只是给我一个通用的"对象"响应,因此代码不起作用.我通过为每个对象使用映射函数来解决这个问题,例如:
function …Run Code Online (Sandbox Code Playgroud) 我想知道将get响应中的http响应映射到类而不是基本Javascript对象的最佳方法是什么.
在我目前的尝试中,我很简单new ClassName(data),但可能有一个模糊的Angular指定和完全令人敬畏的方式,我不知道.
这是我目前的代码:
getPost(id:number){
return this._http.get(this._postsUrl+'/'+id)
.map(res => new Post(res.json().data))
.do(data => console.log(data))
.catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)
我需要Post成为一个类,而不仅仅是一个接口,因为我有内部方法.
我按照HeroTutorial和http"开发人员指南"进行操作,并按照他们的getHeroes方法执行:
getHeroes () {
return this.http.get(this._heroesUrl)
.map(res => <Hero[]> res.json().data)
.catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)
我不知何故希望这<Hero[]>部分能做到这一点:拿Hero类并创建它的新实例,但我的测试表明它没有,这几乎只是Typescript知道会发生什么.
有任何想法吗 ?谢谢!
function Person() {
var self = this;
self.personName="";
self.animals=[];
}
function Animal(){
var self=this;
self.animalName="";
self.run=function(meters){
.....
}
}
Run Code Online (Sandbox Code Playgroud)
服务器响应:
[{personName:John,animals:[{animalName:cheetah},{animalName:giraffe}]} , {personName:Smith,animals:[{animalName:cat},{animalName:dog}]} ]
Run Code Online (Sandbox Code Playgroud)
我从服务器获取Person数组.我想将通用Person数组转换为类型Person数组.所以我可以使用
persons[0].Animals[2].Run();
Run Code Online (Sandbox Code Playgroud)
我创建了Javascript
Object.create(Person,person1);
Run Code Online (Sandbox Code Playgroud)
但我希望它的跨浏览器版本支持阵列
ObjectArray.create(Person,persons);
Run Code Online (Sandbox Code Playgroud)
要么
Object.create(Person[],persons);
Run Code Online (Sandbox Code Playgroud) 我想做以下事情
var my_json = {
a : 'lemon',
b : 1
}
function obj(json){
this.a = 'apple';
this.b = 0;
this.c = 'other default';
}
Run Code Online (Sandbox Code Playgroud)
分配后
var instance = obj(my_json)
Run Code Online (Sandbox Code Playgroud)
我想得到
instance.a == 'lemon'
Run Code Online (Sandbox Code Playgroud) 我有这样的模型:
export default class UserObject
{
name: string;
id: string;
validateInsert()
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果我喜欢这样:
const modelUser: UserModel = new UserModel();
modelUser.ID = 1;
modelUser.Name = "Ibrahim Aziz";
modelUser.validateInsert();
Run Code Online (Sandbox Code Playgroud)
一切工作正常,但如果我这样做:
modelUser = JSON.parse(stringJSONUser);
modelUser.validateInsert();
Run Code Online (Sandbox Code Playgroud)
我会收到错误消息,说 validate insert 不是一个函数,似乎 JSON 解析只传递值,甚至不启动它自己的对象,知道吗?