如何将不正确类型的值强制转换为属性?

时间:2016-06-02 12:50:56

标签: typescript

是否有一种简单的方法可以将不正确类型的值强制转换为属性?例如,我想将number属性设置为string值。

这看起来很愚蠢,但有一个很好的理由:这是一些外部普通的javascript组件实际上会到我的类的实例。

这是我想要的重复:

class DemoController {
    constructor(public myPercentage: number = 50) { }
}

function MyUnitTest() {
    var sut = new DemoController(25);

    // The following line simulates what an outside component will do
    // to instances, but the compiler will obviously complain about it:
    sut.myPercentage = "10";

    if (sut.myPercentage !== 10) throw new Error("Unit test assertion failed");
}

我试过了:

  • sut["myPercentage"] = "10";
  • sut.myPercentage = <number>"10";
  • var p = "10"; controller.myPercentage = p;

但他们都没有工作。

有没有办法在没有编译器抱怨的情况下将字符串值强制转换为数字属性?

顺便说一句,我的上下文是an issue in Angular when combining inputs of type range and number需要解决方法,你需要这样做......

class DemoController {
  constructor(private $scope: ng.IScope, public myPercentage: number = 50) {
    $scope.$watch(
      () => this.myPercentage,
      () => this.myPercentage= parseFloat(<any>this.myPercentage)
    );
  }     
}

...因为Angular意外将myPercentage设置为字符串

这个背景确实意味着我的实际问题在某种程度上是一个XY问题。最后我试图解决这个角度问题。但是,在这一点上,我本质上也很好奇你如何解决Y:如何让TS单元测试模拟绕过你的类型信息的“恶意”外部JS代码。

2 个答案:

答案 0 :(得分:2)

我不是一个有角度的开发人员,但我很确定你的问题可以像这样解决:

class DemoController {
    private _myPercentage: number;

    constructor(myPercentage: number = 50) {
        this._myPercentage = myPercentage;
    }

    set myPercentage(value: number | string) {
        this._myPercentage = typeof value === "string" ? parseInt(value) : value;
    }
}

答案 1 :(得分:1)

编译器允许您将any内容放入number属性中,因此它不会抱怨这段代码:

sut.myPercentage = <any>"10";

在写完答案结束时找到答案,分享,以防有人帮助,或者有人有更好的答案。