2016-06-27 5 views
4

新しいフィールドを追加することによって、TypeScriptでデータオブジェクトを拡張しようとしています。私はそれがJavaScriptでかなり一般的なパターンだと思いますが、barを以下のようにスニペットでオプションにせずに、コンパイルできるようにすることはできません。TypeScriptでデータオブジェクトを拡張する

barをオプションにしないようにする方法はありますか? ご迷惑をおかけして申し訳ございません。ありがとうございます。キャストのこのタイプは、正式type assertionと呼ばれる

interface ExtendedDataObject extends BaseDataObject { 
    bar: string; 
} 

function extendData(input : BaseDataObject) : ExtendedDataObject { 
    var output = input as ExtendedDataObject; 
    output.bar = input.foo + ' some suffix'; 
    return output; 
} 

、それはあなたを信頼するようにコンパイラに指示します:

interface BaseDataObject { 
    foo: string; 
} 

interface ExtendedDataObject extends BaseDataObject { 
    bar?: string; 
} 

function extendData(input : BaseDataObject) : ExtendedDataObject { 
    var output : ExtendedDataObject = input; 
    output.bar = input.foo + ' some suffix'; 
    return output; 
} 

答えて

4

あなただけoutputに割り当てるのではなく、コンパイル時inputExtendedDataObjectにキャストすることにより、これを行うことができますオブジェクトを指定したタイプとして扱うことができます。

+0

これを回避するにはこれが唯一の方法だと思われます。 – choz

+0

それは、ありがとう、働く。そして、欠落しているフィールドのコンパイル時チェックがバイパスされていると思います。 – Haocheng

+1

@Haochengこれは正式に[タイプアサーション](https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html)と呼ばれ、コンパイラに、オブジェクトあなたが指定したタイプとして扱うことができます。 – JohnnyHK

関連する問題