2016-09-01 46 views
4

級聯我在我的打字稿三班變量:打字稿:試圖增加兩個變量,但得到的兩個

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

在課堂上的另一部分我儘量讓另外兩個變量A和B:

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

,我在HTML模板

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

我的問題是顯示C,而不是獲得兩個變量的加法(20+50=70)我得到了連接(2050)!

有人可以幫我嗎?

UPDATE

這裏是確切的代碼部分,其導致的問題:

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

注意pageLastNumber被聲明爲數字型,LINE_OFFSET被奧斯陸號碼型,i已經找到了解決這個問題,但打字稿編譯器輸出錯誤(禁止評估):

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

UPDATE

這裏是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有ab爲字符串,而不是數字和聲明爲數字接口中對運行結果沒有任何影響。

如果你從服務器獲取編碼爲字符串而非數字,那麼你就需要將它們轉換,例如:

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

這意味着有在A或B的變量的字符串值。檢查您的代碼中是否存在不安全的部分,我的意思是轉換爲<any>,並將服務器響應轉換爲接口。這可能導致在number變量中有string值。

+0

在我的服務器響應接口中,我試圖顯示的變量以「數字」類型聲明! –

+0

@NacimIdjakirene你檢查了服務器的迴應嗎?也許類型界面錯了!如果服務器響應與typescript中的類型接口不匹配,則由於typescript不會執行運行時類型檢查,所以它不會被檢測到,它只是假設正確的類型。 –

1

問題是變量類型轉換未完成。 您需要按照以下方式進行操作。

答:parseInt(number); B:parseInt(number);

然後你會得到總和C = A + B而不是串聯。

+2

這不是類型轉換,而是轉換。另外,在他的例子中'number'不是一個變量,而是一個類型聲明。 –

0

Finnaly我查找原因錯誤,我從html模板(它是一個輸入值)獲取頁面變量,它被定義爲函數參數中的數字類型,但實際上是一個字符串,typescript不能從html模板檢查變量的類型,所以當嘗試parseInt(頁面)靜態打印突出顯示一個錯誤!通過給頁面變量一個「」類型,然後將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