2017-01-31 11 views
1

、定数をインタフェースに適合するようになっていることを宣言するための2つの方法があります。TypeScriptでは、const fooを使用する理由がありますか?Type = {...}またはconst foo = {...}をTypeとして使用しますか?活字体で

interface Foo { x: string; } 
const HELLO: Foo = { x: 'hello' }; 

又は

interface Foo { x: string; } 
const HELLO = { x: 'hello' } as Foo; 

これらは、同じ効果を持つように見える:活字体を有するものとしてHELLO扱わタイプがFooで、interface Fooに表示されないメンバーを割り当てると、エラーが発生します。

あるフォームと他のフォームを好む理由はありますか?それらはまったく同等ですか?

答えて

2

これはTypescript 2.1.4用です。私は他のバージョンの違いを認識していません。 、あなたは本質的Fooをインターフェイスにキャストしている二一

interface Foo { x: string; } 
const HELLO: Foo = { x:'hello', y: 'goodbye' }; // Will not compile. 

コンパイルがあるように限り、:あなたがこれを行うのですかだったら最初の一

は、コンパイルエラーを取得する必要がありますこれは完全に有効です。

interface Foo { x: string; } 
const HELLO = { x:'hello', y: 'goodbye' } as Foo; // No compilation error. 
const yValue = HELLO.y; // compilation error because "y" should not exist according to the interface 
const yValue2 = (HELLO as any).y // suddenly works; yValue2 === "goodbye" 

前者がそれは愚かなエラーを防ぐことができて、あなたが追加したデータを持つオブジェクトを作成できません。後者は、インターフェイスと同じ値を持つ既に作成されたオブジェクトをキャストできます。そのオブジェクトをインターフェイスのように他の関数またはクラスに渡すことができます。基本的に追加の値は隠されます。

5

あなたの例では、割り当ては同じになることが分かります。しかし、2番目の例のように、最初の例のように変数をタイプし、変数を型キャストする機能は同じではありません。あなたが割り当てられたオブジェクトは、完全一致の形を持っている場合にのみ、変数作品を入力して、見ることができるように

interface Foo { x: string; } 
interface Foo2 extends Foo { y: string; } 

// typing the variables 
const hello: Foo = { x: 'hello' }; // works 
const hello2: Foo2 = { x: 'hello', y: 'hello' }; // works 
const hello3: Foo2 = { x: 'hello' }; // does not work because property 'y' is missing 

// typecasting the variables 
const hello4 = hello as Foo2; // works 
const hello5 = hello2 as Foo2; // works 
const hello6 = { x: 'hello' } as Foo2; // works 

// typing the variables 
const hello7: Foo = {}; // does not work because property 'x' is missing 
const hello8: Foo2 = {}; // does not work because property 'y' is missing 
// typecasting the variables 
const hello9 = <Foo>{}; // works 
const hello10 = <Foo2>{}; //works 

// typing must match exact form, where typecasting does not, as long as interface is honored 
const hello11: Foo = { x: 'hello', y: 'hello' }; // fails because of extra property 'y' 
const hello12 = { x: 'hello', y: 'hello' } as Foo; // works 

:ここ

は、拡張された例です。たとえ無効なオブジェクトで初期化した後、いくつかのロジックセットを使用するなど、ある時点で確実に行うことをタイプコピーに伝えることを意味するので、変数の型キャストは有効です。残りの不足している特性。

タイプキャスティングは、asキーワードを使用するか、または割り当てられた変数の前に<type>を付けることで実行できます。

関連する問題