如果我有一个类,比如:
export interface Results {
xrf: any;
ftir: any;
level: any;
}
export class myClass{
Results: Results;
remark: string;
}
和一个JSON对象,如:
{
"Results": {
"xrf" : "xrfresult",
"level": "21"
},
"remark" : "Test 1"
}
如果我使用let obj: myClass= JSON.parse(jsonobj)
解析该对象,则该对象缺少字段ftir
。有没有办法从没有typescript类所有字段的JSON对象中自动创建缺少的字段?
发布于 2017-11-12 15:51:53
并非接口的所有属性都是必需的。有些在特定条件下存在,或者根本就不存在。这些可选属性在创建像“选项包”这样的模式时很流行,在这种模式中,您将一个对象传递给一个只填充了几个属性的函数。
具有可选属性的接口的编写方式与其他接口类似,每个可选属性由?表示。在声明中的属性名称的末尾。
在ftir中是可选的,因为输入对象没有这个属性。如果您尝试在对象分配后访问ftir,则会得到未定义的结果。
export interface Results {
xrf?: any;
ftir?: any;
level?: any;
}
export class myClass{
Results: Results;
remark: string;
}
export class HomePage {
results : Results;
jsonObj : myClass;
jsonString : any;
ftir : any;
constructor(public navCtrl: NavController) {
this.jsonObj={
"Results": {
"xrf" : "xrfresult",
"level": "21"
},
"remark" : "Test 1"
}
this.ftir=this.jsonObj.Results.ftir
this.jsonString=JSON.stringify(this.jsonObj);
console.log(this.ftir);
}
}
发布于 2017-11-12 17:52:37
不,没有内置的方法可以做到这一点。JSON对普通对象进行操作。您的类型批注在运行时没有任何影响,所有类型都会被擦除,并且只允许这样做,因为JSON.parse
不返回特定类型,而是返回any
。
在反序列化值的引用上使用类类型的注释是一个非常糟糕的想法。
虽然理论上您可以实现实例化类的功能,但您需要在每个调用点手动执行此操作,或者更改全局JSON
对象的行为。后一种方法实际上是不可行的,因为您会破坏依赖关系,而前一种方法是一场维护噩梦,一旦不可避免地引入嵌套值,它就会引入极大的复杂性。
因此,您不应该使用类,而应该使用接口。此外,正如另一个答案中所建议的,您应该将可能缺失的成员注释为可选的。
您需要自己提供默认值。
https://stackoverflow.com/questions/47245588
复制相似问题