TypeScriptクラスには3つの変数があります。
A:number;
B:number;
C:number;
クラスの別の部分では、2つの変数AとBを追加しようとします:
this.C = this.A+this.B; // A =20 and B = 50;
そして、HTMLテンプレートにCを表示します
<span>{{C}}</span>
私の問題は、2つの変数(20+50=70)
を追加する代わりに、連結(2050)を取得することです!!
誰かが私を助けてくれますか?
[〜#〜] update [〜#〜]:
問題を引き起こす正確なコード部分は次のとおりです。
goTo(page:number,type:script) {
//
this.pageFirstLineNumber = page;
this.pageLastLineNumber = page + this.LINE_OFFSET; //concatenation!!
}
PageLastNumberは数値型として宣言され、LINE_OFFSETはolso数値型であることに注意してください。この問題の解決策を見つけましたが、TypeScriptコンパイラーはエラー(evalを禁止)を出力しました。
////
....
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);
}
}
インターフェースで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
( 遊び場のコード全体 )
問題は、変数の型キャストが行われないことです。次の方法で行う必要があります。
A:parseInt(number); B:parseInt(number);
連結の代わりに合計C = A + bが得られます。
つまり、A変数またはB変数のいずれかに文字列値があります。安全でない部分がないかコードを確認してください。つまり、<any>
、およびインターフェイスへのサーバー応答のキャスト。そのため、string
変数にnumber
値が含まれる可能性があります。
最後に、エラーの原因を見つけ、htmlテンプレートからページ変数を取得します(入力値)。関数パラメーターで数値型として定義されていますが、実際には文字列であり、TypeScriptは変数の型をチェックできませんhtmlテンプレート。したがって、try parseInt(page)static typpingでエラーがハイライトされます。ページ変数に「」タイプを指定してから、parseIntをページ変数に適用することで問題を解決しました。
私は同様の問題に遭遇し、以下のように解決することができました:
C:number =0;
A:number=12;
B:number=0.4;
C= Number.parseInt(A.toString()) + Number.parseFloat(B.toString());
console.log("C=" + C );
は、数値を文字列に変換し、再び数値に解析するのは愚かなようですが、これが私の問題を解決した方法です。