2015-11-09 3 views
2

Спасибо за ваше терпение здесь, я только начинаю с TypeScript.Как правильно изменить тип переменной в 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 
    ) 
    {} 
} 

Любые идеи? Спасибо всем!

+1

Что такое определение 'ModelFields' ? – Paleo

+0

@Tarh 'экспорт класса ModelFields { конструктор ( общественного FIELDNAME: любые, общественности anotherField: любой ) {} }' – ryanrain

ответ

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 slides и docs

Надеется, что это может немного помочь ...

+0

спасибо Янов, и извините за мое отсутствие ясности. Я думаю, что понимаю концепцию вывода TypeScript - очень важно. В моем коде, вероятно, я использую метод 'replace' string, который делает инспектором TypeScript, что моя' model' является объектом строк. – ryanrain

+0

Чтобы уточнить, я пытаюсь спросить, возможно ли ** явно ** и правильно изменить тип переменной, например, от строки до числа, не вызывая ошибки компилятора. Имеет ли это смысл? – ryanrain

+0

URL-адрес для слайдов. – MikeMurko

2

Вы не можете изменить тип переменного в машинописном, что как раз наоборот TS было сделано для. Вместо этого вы можете объявить переменную как «any», которая будет эквивалентна классической переменной «var» в JS, нетипизированной.

Как только переменная объявлена, вы не сможете ее повторить. Однако вы могли бы объявить «any», а затем использовать его, когда хотите его использовать, чтобы использовать его как желаемый тип.

Например, это не будет бросать какие-либо ошибки:

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