2017-07-21 5 views
0

インターフェイスを定義するとき、TypeScriptのドキュメントには、オブジェクトがインターフェイスの形をとっている限り、余分なオブジェクトのプロパティが許可されていることが記載されています。中括弧で定義されている場合にのみ、オブジェクトで過剰なプロパティを許可するのはなぜですか?

interface Person { 
    name: string 
} 

function print(somebody: Person) { 
    console.log(somebody.name); 
} 

let obj = { name: "Johnny", additionalProps: true } 

print(obj); // this is okay 

しかし、関数のパラメータのためにこれだけ本当ですか?以下では、特定の型としてオブジェクトキャストを作成しようとし、中括弧を使用しない場合にのみ追加のプロパティを追加するとエラーがスローされます。

interface Animal { 
    name: string; 
} 

let myDog = <Animal> { 
    name: "Spot", 
    altProperty: "anything" // no error 
}; 

myDog.altProperty = "anything else"; // Property 'altProperty' does not exist on type 'Animal' 

そのタイプをアサートするときにオブジェクトに好きなだけプロパティを割り当てることができますが、彼らは型定義ではありませんので、あなたがこれらのいずれかにアクセスすることはできませんようです。どうしてこれなの? typescriptですで

答えて

1

インタフェースは、単にメンバーがオブジェクトに利用可能であるかを説明コンパイル時のチェックを提供します。ここ

あなたのコード:

let myDog = <Animal> 

は、「私は、いくつかのオブジェクトを持っていますが、私はAnimalインタフェースで定義されたメンバーを公開したい」と言っています。明示的あなたはAnimalで定義されていないメンバーを参照史上たときにエラーを与えることコンパイラに指示しました。

あなたは、オブジェクトを作成するときに、あなたがまだそれをタイプが与えられていないため、altPropertyを参照することができます。ただし、次のように記述することであった:

let myDog: Animal = { 
    //name: "Spot", 
    altProperty: "anything" // no error 
}; 

あなたは今Animal

に無効なオブジェクトをキャストしようとするため、エラーになるだろう、あなたが使用できるようにAnimalにオブジェクトをキャストする必要はありません。そのように。あなたは書くことができます:

interface Animal { 
    name: string; 
} 

let myDog = { 
    name: "Spot", 
    altProperty: "anything" 
}; 

myDog.altProperty = "anything else"; 

doSomething(myDog); 
function doSomething(object: Animal) {} 

それはうまくいくでしょう。実際、あなたが行ったように変数を明示的に入力する唯一の理由は、あなたが経験しているエラーを意図的にキャッチすることだけです。

関連する問題