2017-11-20 1 views
1

JavaScriptから来たTypeScriptの学習を始めました。インタフェースの仕組みを学んでいます。 IEmailableの形をとるオブジェクトを渡すのsendEmailと呼ばれる以下の機能でtypescriptのインタフェースについての問い合わせ

interface IEmailable { name: string, email: string } 

私はIEmailableと呼ばれる次のインタフェースを作成しました

function sendEmail(contact: IEmailable){ 
    console.log(contact.name + " <" + contact.email + ">"); } 
} 

したがって、これを実行:

sendEmail({ 
    name: "Ciaran", 
    email: "[email protected]  
}); 

有効です。

この実行しているのに対し:

sendEmail({ 
    name: "Ciaran", 
    email: "[email protected], 
    phone: 07927382 
}); 

が有効ではありません。

私のIDEでは、インターフェイスに存在しないインスタンス化されたオブジェクトに新しいプロパティを追加するとエラーが発生します。

「オブジェクトリテラルのみ知られているプロパティを指定することもできる」

は、だから私は、インターフェイスで定義されていないプロパティを追加は行われないことを理解しています。しかし、このチュートリアルでは、新しいプロパティの追加が追加でき、IDEにエラーがスローされないことを示しています。これはTypeScriptの最近のアップデートか、TypeScriptでのインターフェイスの動作を誤解していますか?公式docsを検索しましたが、実際には、サイズという新しいプロパティを追加します。これは、インターフェイスLabelledValueには存在しません。私は間違いなくそれを思慮しているが、誰かがこれをクリアすることができれば、それは素晴らしいだろう。ドキュメントあたりのAS

+0

あなたは、オブジェクトリテラルの「過剰プロパティのチェック」を避けるために、型アサーションを使用することができます。以下の私のコードをチェックしてください。 – Niladri

答えて

2

Object literals get special treatment and undergo excess property checking when assigning them to other variables, or passing them as arguments. If an object literal has any properties that the “target type” doesn’t have, you’ll get an error.

ので、以下のコードは、phoneインターフェイスIEmailable

sendEmail({ 
    name: "Ciaran", 
    email: "[email protected], 
    phone: 07927382 
}); 

上に存在するものではありませんが、タイプを使用しているを回避することができますようにエラーが発生しますアサーションは以下のようになります

sendEmail({ 
    name: "Ciaran", 
    email: "[email protected]", 
    phone: 7927382 
} as IEmailable); 

は、オブジェクトは、あなたがここで

interface IEmailable { 
    name: string, 
    email: string, 
    [propName: string]: any; 
} 

以下のように引数として渡すことができますいくつかの余分なプロパティはフィドルに働きリンクで持つことができることを確認するインターフェイスに文字列インデックスの署名を追加することができます。

"Fiddle"

関連する問題