如何在TypeScript中正确更改变量的类型?

时间:2015-11-09 18:25:09

标签: typescript angular typescript1.5

感谢您的耐心等待,我刚开始使用TypeScript。

我正在开发一个角度2的应用程序,需要接受文本输入,然后进行一堆计算。我(错误地?)假设我需要先将输入绑定到"任何"在我的数据模型中键入变量,然后将这些变量转换为数字以便处理数字。我看了四周,无法找到如何做到这一点,以至于它不会抛出这个TS编译器错误:

`src/calculator_service.ts(40,5): error TS2322: Type 'number' is not assignable to type 'string'.`

在我的CalculatorService中,我有这个功能:

/*
 * Convert the object of strings recieved from the form into a clean object of integers
 */
n(model:ModelFields) {
    // Clone it
    this.numericModel = Object.assign({}, this.model);

    for (var prop in this.numericModel) {
        if (this.numericModel.hasOwnProperty(prop)) {

            // strip off all non-numeric charactersklj
            this.numericModel[prop] = this.numericModel[prop].replace(/\D/g,'');

            // convert to Any typescript type
            // this breaks the application, and still throws a compiler error. nope.
            // this.numericModel[prop] = this.numericModel[prop]:Any;

            // convert to Number type
            // this gives a typescript console error, but seems to still compile... 
            // ignoring this for now in order to meet deadline
            this.numericModel[prop] = +this.numericModel[prop];

        }
    }

    return this.numericModel;
}

和ModelFields定义(谢谢tarh!)

export class ModelFields { 
    constructor( 
        public fieldName: any, 
        public anotherField: any 
    ) 
    {} 
}

有什么想法吗?谢谢大家!

3 个答案:

答案 0 :(得分:10)

你无法在TypeScript中更改变量的类型,而这只是为了制作相反的TS。相反,你可以将变量声明为"任何",这相当于经典" var" JS中的变量,无类型。

声明变量后,您将无法重新键入变量。但是,你可以做的是声明"任何"然后在您想要使用它时将其强制转换,以便将其用作所需类型。

例如,这不会引发任何错误:

let a: any;

a = 1234;
(a as number).toExponential();

a = "abcd"; 
(a as string).substr(1, 4);

如果您的课程,这也是正确的,没有类型错误:

class ModelFields { 
    constructor( 
        public fieldName: any, 
        public anotherField: any 
    ) 

    //...
}

let model: ModelFields = new ModelFields(1, 2);

console.log(model.fieldName + model.anotherField);    // --> 3

model.fieldName = "a";
model.anotherField = "b";

console.log(model.fieldName + model.anotherField);    // --> ab

答案 1 :(得分:1)

你的例子不够明确,但我想你的问题是因为打字稿推理

var x = 3; // x is a number
x = "45";  // compiler error

但是,如果你这样做:

var x : any = 3; // x can be anything
x = "45";

或者:

var x; // x is any forever
x = '45';  // x is still any

您可以在those great slidesdocs

上找到更多详细信息

希望这有点帮助...

答案 2 :(得分:0)

遇到过类似的查询并为我工作。

我的案子:

article Id是来自路由参数的字符串格式,并且来自API,我以数字格式获取数据。

如果我使用!=进行检查,则ES皮棉会引发错误。因此,我正在使用Number()方法在香草javascript中将字符串转换为数字。

const articleId = Number(this.route.snapshot.params['articleId']);

data.forEach((element, index) => {

    // console.log(typeof(element['id']), element['id']); 
    // 4, number
    // console.log(typeof(this.route.snapshot.params['articleId']), this.route.snapshot.params['articleId']);
    // 4, string (converted to number)

    if (element['id'] !== articleId) {
        //my implementation
     }
}

参考链接:

  1. https://gomakethings.com/converting-strings-to-numbers-with-vanilla-javascript/