假设我必须读取JSON响应,其中所有参数都编码为字符串,无论它们是否为数字。我想严格将它们键入各种Typescript类。因此,我们可以说JSON是这样的:
{"id":"1","label":"Alice"}
我有一个像这样的Typescript类:
class Person {
public id:number;
public label:string;
}
假设使用AS3之类的语言,我可以避免使用显式构造函数,而只是说:
var p:Person = new Person();
p.id=jsonInput.id;
p.label=jsonInput.label;
然后ID将自动键入数字。无需parseInt()或parseFloat()或* 1。
就我而言,我必须快速遍历各种大型,复杂的JSON对象,这些对象需要根据服务器值定期创建,更新和销毁Typescript对象。我想避免必须检查某些参数是否为数字。我已经在要放入的类属性中声明它们为数字。但是发生的是,尽管在Typescript类定义中将Person.id声明为数字,但是您仍然可以在运行时为它分配一个字符串,从那时起,它就像字符串一样。
这对于布尔值尤其令人讨厌,因为服务器结果是“ 0”或“ 1”字符串,因为您不能将其自动转换为布尔值或数字,以后对这些变量的每次检查都必须将它们进行比较到字符串“ 0”或“ 1”。
所以我想知道的是,有没有一种优雅的方法来处理对类属性的赋值,以便将我在类定义中指定的类型强制输入到输入中?我的意思是,我想利用类的定义,而不是检查从服务器接收到的每条信息是否都是数字的,而是尝试向类中分配非数字字符串,从而获得null或该属性中的错误。数;如果将数值分配给键入为“字符串”的变量,则获得字符串;如果我为类型为“ boolean” ...等的变量赋非0或false的值,则返回boolean。类似于其他语言。有可能吗?
答案 0 :(得分:0)
您可以查看getter / setter函数。
这将使您拥有更多的逻辑来将变量检查/转换为所需的类型。
class Person {
private _id: string
get id() {
return this._id;
}
set id(val) {
// do checking to make the id into a string
this._id = // properValue
}
}
这意味着,如果您有一个数字并将其设置为id,则可以在分配数字之前将其变成字符串。
例如
使用以下Person
定义
class Person {
private _id: string
get id() {
return this._id;
}
set id(val) {
// example handling of both number and string value
this._id = typeof val === 'number' ? `${val}` : val
}
}
您可以为id
属性分配数字,它们将被转换为字符串。
const myPerson: Person = new Person();
myPerson.id = 2
typeof myPerson.id // string