一种使用构造函数将字符串转换为Typescript类中数字的优雅方法?

时间:2019-03-25 22:39:19

标签: typescript

假设我必须读取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。类似于其他语言。有可能吗?

1 个答案:

答案 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