2016-09-01 10 views
4

У меня есть три переменные в моем классе Машинопись:Машинопись: Попытка сложение двух переменных, но получить конкатенацию двух

A:number; 
B:number; 
C:number; 

в другой части класса я пытаюсь сделать добавление двух переменных а и Б:

this.C = this.A+this.B; // A =20 and B = 50; 

и отобразить C в шаблоне HTML

<span>{{C}}</span> 

Моя проблема есть, вместо того, чтобы получить добавление переменной TWO (20+50=70) Я получаю конкатенацию (2050) !!

Может кто-нибудь помочь мне, пожалуйста?

ОБНОВЛЕНИЕ:

Вот точная часть коды, которые вызывают проблемы:

goTo(page:number,type:script) { 
    //  
    this.pageFirstLineNumber = page; 
    this.pageLastLineNumber = page + this.LINE_OFFSET; //concatenation!! 
} 

Обратите внимание, что pageLastNumber объявлен как тип номера, LINE_OFFSET является Olso типа номера, я нашел решение этот вопрос, но выход машинопись компилятор ошибки (запрещенная Eval):

//// 
.... 
this.pageFirstLineNumber = eval(page.toString()); // now It works !! 
this.pageLastLineNumber = page + this.LINE_OFFSET; //concatenation!! 

ОБНОВЛЕНИЕ

Вот декларация переменной LINE_OFFSET:

private _calculateOffset(fontSize: number) { 
    let linesDiff = (fontSize * 27)/14; 
    let lines:number = 27 - (linesDiff - 27); 
    this.LINE_OFFSET = Math.floor(lines); 
    if (fontSize >= 17 && fontSize <= 20) { 
     this.LINE_OFFSET += (Math.floor(fontSize/3) - 2); 
    } 
    if (fontSize > 20 && fontSize <= 23) { 
     this.LINE_OFFSET += (Math.floor(fontSize/2) - 2); 
    } 
    if (fontSize > 23 && fontSize <= 25) { 
     this.LINE_OFFSET += (Math.floor(fontSize/2));} 
    if (fontSize > 25 && fontSize <= 27) { 
     this.LINE_OFFSET += (Math.floor(fontSize/2) + 1); 
    } 
    if (fontSize > 27 && fontSize <= 30) { 
     this.LINE_OFFSET += (Math.floor(fontSize/2) + 4); 
    } 
} 
+0

Пожалуйста, добавьте к вашему вопросу той части, где вы присваиваете значения 'a' и' b' –

+0

Это не имеет значения, как эти свойства объявляются , если во время выполнения вы получаете строку, то это строка, независимо от того, были ли они объявлены как числа. Как назначается 'this.LINE_OFFSET'? Кроме того, не используйте 'eval', используйте' parseInt' или 'parseFloat' или' Number' –

ответ

8

Когда вы объявляете в интерфейсе, что свойство является number, то оно остается только в качестве объявления, оно не будет переведено в javascript.

Например:

interface Response { 
    a: number; 
    b: number; 
} 

let jsonString = '{"a":"1","b":"2"}'; 
let response1 = JSON.parse(jsonString) as Response; 

console.log(typeof response1.a); // string 
console.log(typeof response1.b); // string 
console.log(response1.a + response1.b); // 12 

Как вы можете видеть, JSON имеет a и b как строки, а не как числа и объявлять их числа в интерфейсе не оказывает никакого влияния на результат выполнения.

Если то, что вы получите с сервера кодируются в виде строк вместо чисел, то вам нужно преобразовать их, например:

let response2 = { 
    a: Number(response1.a), 
    b: Number(response1.b) 
} as Response; 

console.log(typeof response2.a); // number 
console.log(typeof response2.b); // number 
console.log(response2.a + response2.b); // 3 

(entire code in playground)

+0

вопрос обновлен, вы видите ошибку? –

0

Это означает, что есть строковые значения в А или В переменных. Проверьте свой код на небезопасные части, я имею в виду листинг на <any> и ответы сервера отклика на интерфейсы. Это может привести к значениям string в переменных number.

+0

В моих интерфейсах ответа сервера переменные, которые пытаются отобразить, объявляются в типе «число»! –

+0

@NacimIdjakirene Вы проверили ответ сервера? Может быть, интерфейс типа просто ошибается! Если ответ сервера не соответствует интерфейсу типа в машинописном тексте, он остается необнаруженным, поскольку машинопись не будет выполнять проверки типа времени выполнения, она просто принимает правильные типы. –

1

Проблема: переменная приведение типов не выполняется. Вам нужно сделать следующим образом.

A: parseInt (number); B: parseInt (число);

тогда вы получите сумму C = A + b вместо конкатенации.

+2

Это не типизация, это преобразование. Кроме того, в его примере 'number' не является переменной, а объявлением типа. –

0

Finnaly я найти то, что причиной ошибка, я получаю переменную страницы из html-шаблона (ее входное значение), она определяется как тип номера в параметре функции, но на самом деле строка и машинопись не проверяют тип переменной из html-шаблона, поэтому, когда попробуйте parseInt (page) static typping выделите ошибку! я решил проблему, указав переменную страницы типа «», а затем применив parseInt к переменной страницы.

0

я столкнулся с подобной проблемой, был в состоянии решить, как показано ниже:

C:number =0; 
A:number=12; 
B:number=0.4; 
C= Number.parseInt(A.toString()) + Number.parseFloat(B.toString()); 
console.log("C=" + C); 

кажется глупым, чтобы преобразовать число в строку и снова разобрать номер, но это, как я решить мою проблему.

4

предварять число с +:

let a = +b + +c; 

ref

 Смежные вопросы

  • Нет связанных вопросов^_^