来自“ any”的变量分配返回错误的数据类型

时间:2018-11-09 15:43:17

标签: angular typescript

我正在从httpclient的结果中序列化/映射数据,如下所示:

export class Foo {
    constructor() {
        this.bar = 0.00;
    }
    bar: number;
}

fromJson(json: any) : Foo {
    const foo = new Foo();
    foo.bar = json.bar;
    return foo;
}

当我写console.log(typeof foo.bar)时,我得到string而不是number。这是预期的结果吗,我真的需要输入强制转换foo.bar = parseInt(json.bar)吗?

2 个答案:

答案 0 :(得分:3)

  

当我编写console.log(typeof foo.bar)时,我得到的是字符串而不是数字。这是预期的结果

是的。 TypeScript不会为您插入转换代码。

  

...而且我真的需要输入强制转换foo.bar = parseInt(json.bar)吗?

这不是强制转换¹,但是,是的,如果您的起点不是数字,那么您确实需要转换为数字(parseInt是做到这一点的一种方法-there are several,每个都有优点和缺点缺点-如果您的起点是字符串)。

¹实际上,TypeScript没有强制类型转换,它具有type assertions,这是相似但不同的。

答案 1 :(得分:0)

目前无法发表评论,但想与一个概念验证点共享一个Codepen: https://codepen.io/abarrenechea/pen/xQOqdX

class Foo {
  constructor() {
    this.bar = 0.00;
  }
  bar: number;
}

var foo1 = new Foo();
foo1.bar = "Hello";

var foo2 = new Foo();
foo2.bar = 10;

var foo3 = new Foo();
foo3.bar = true;

document.getElementById("foo1").innerHTML = foo1.bar + " | Type: " + typeof foo1.bar; // this is a string
document.getElementById("foo2").innerHTML = foo2.bar + " | Type: " + typeof foo2.bar; // this is a number
document.getElementById("foo3").innerHTML = foo3.bar + " | Type: " + typeof foo3.bar; // this is a boolean

如果需要保持应首先转换的类型,则将覆盖变量。