2017-11-18 8 views
0

TypeScriptを使用して、推論し、分析したタイプのビューを任意の方法でオーバーライドすることは可能ですか?Typescript型変換

次の簡単な例を考えてみてください

let myAge: number; 
myAge = window.prompt('age?'); 
    // we cannot do this because window.prompt returns a string 
    // so we need a type assertion, but the 2 ways I know does not cut it 

let myAgeStr: string; 
myAgeStr = window.prompt('age?'); 

// method 1 
myAge = myAgeStr as number; // fails 

// method 2 
myAge = <number> myAgeStr; // also fails 

FailsType 'string' is not assignable to type 'number'を意味します。

私たちは何をしていますか?

+1

あなたは 'myAge = + myAgeStr;'または 'myAge = parseInt(myAgeStr);' – Niladri

+0

で標準のjavascript変換を試してみることができます。 – Niladri

+0

like this fiddle https://www.typescriptlang.org/play/#src=let%20myAge%3A%20number%3B%0D%0Alet%20myAgeStr%3A%20string%3B%0D%0AmyAgeStr%20%3D%20window .prompt( '年齢%3F')%3B%20%0D%0AmyAge%20%3D%20%2BmyAgeStr%3B%20%0D%0Aconsole.log(myAge)%3B – Niladri

答えて

4

TL;あなたはそれをすることができますが、おそらくしたくないでしょう。文字列を数値として解析します。


タイプのアサーションは、少なくとも1つのタイプが他のタイプに割り当て可能な場合にのみ許可されます。あなたはスーパータイプに値を広げ、安全な「鋳造アップ」の方向は、(情報を捨てる)があります:

// safe 
let h = "hello" as (string | number); // widening string to string|number 

をとあります(あなたがサブタイプに値を狭める方向を、「ダウンキャスト」安全でありません

// unsafe but correct 
let okay = h as "hello"; // narrowed string|number to string literal "hello" 
// unsafe and incorrect 
let notOkay = h as "goodbye"; // narrowed string|number to string literal "goodbye". 

しかし、あなたが行うことができないこともない、一方が他方に割り当て可能である2つの無関係な種類の、間タイプのアサーションを行うです:)コンパイラが確認できない情報を追加すること

let s = "string"; 
s as number; // error 
let n = 1; 
n as string; // error 

タイプシステムからのエスケープハッチであるanyを入力します。タイプanyは、他のすべてのタイプに割り当て可能であるとみなされます。 本当にの値が無関係なタイプであると主張したい場合は、anyを仲介者として使用できます。

n = s as any as number; // you're the boss 
s = n as any as string; // you're the boss 

だから、あなたがそれを行うことができます:これは、もちろん、非常に安全ではない

myAge = window.prompt('age?') as any as number; // bad idea 

しかし、それをしないでください。 TypeScriptは、stringnumberではないことを正しく警告しています。それは、彼らが期待するものだならば確かに、JavaScriptの機能の多くは、文字列を数値に強制変換されますが、JavaScriptの多くははそれをしない機能:

n = "3" as any as number; 
console.log(n + 5); // 35, not 8! 

をだから、できるように活字体を強制的に本当に悪い考えですあなたは愚かなことをする。あなたは数として文字列を解釈するようにしたい場合は、それを解析:

let myAge: number; 
myAge = Number(window.prompt('age?')); // always a number, may be NaN 

Number関数は常にnumberを返し、活字体がこれを知って、今、あなたと活字体の両方がコンパイル時に、満足していますおよびランタイム。 NaNnumberであり、Number("hello")のようなことをすればそれが得られることを覚えておいてください。だからmyAgenumberとした後、数字で何かを行う前にisNaN()でチェックしたいと思うかもしれません。


がんばろう!