2016-05-11 13 views
0

私は検索を実行する機能を持っています。検索は、IDを探すか、またはいくつかの属性を照会することによって、いくつかの異なる方法で行うことができます。しかし、私は渡すことができますどのような属性を制限したい、私は私のような何かができると思った:。Typescriptインターフェイスを使用すると、インターフェイスに定義されていない属性を破棄できますか?

interface Search { 
    _id?: string 
    people?: number 
    partyName?: string 
    otherField? string 
} 

function search(query: Search) { 
    myDbConnection.find(query).then(... // etc 
} 

問題は、任意のオブジェクトは、これに準拠することで、queryは、追加の属性を含めることができます。たとえば、これは渡すことができます。

search({otherField: "foo", aProtectedField: "bar"}) 

aProtectedFieldfindに渡されます。

渡された属性を強制するタイスクリプトの方法があるのだろうかと思います。 Railsの世界からの強力なパラメータの並べ替え。私はpickフォームlodashや多分SearchObjectクラスを作って、余分な属性を破棄する手段としてコンストラクタを使うこともできると知っていますが、これは私が知りませんTypescript内でこれを行う方法です約。

答えて

0

プロパティのサブセットを渡すために必要なすべてのプロパティを作成し、アサーションを行うことができます。例えば

interface Search { 
    _id: string; 
    people: number; 
    partyName: string; 
    otherField: string; 
} 

function search(query: Search) { 
    // code here 
} 

search({ people: 2 } as Search); // ok 
search({ otherField: "foo", aProtectedField: "bar" }); // error, good 
search({ otherField: "foo", aProtectedField: "bar" } as Search); // error, good 
0

活字体のどのバージョンあなたがオンになっていますか? Typescript 1.6以来、improved checking for object literalsがありました。 TS 1.8で

私はあなたのコードを実行しようとすると、私が取得:

エラーTS2345:型の引数「{otherField:文字列; aProtectedField:文字列。 } 'は'検索 'タイプのパラメータに割り当てられません。 オブジェクトリテラルは既知のプロパティのみを指定でき、 'aProtectedField'は 'Search'タイプに存在しません。

これとnoImplicitAnyは、あなたが心配しているエラーをキャッチする必要があります。

0

どの属性を渡すことができるか制限したい[...]クエリには余分な属性が含まれている可能性があります。

私はそれを見る方法は、これは議論の余地があります。指定されたオブジェクトに含まれる可能性のある属性を制限する場合、その属性のセットに限定され、定義によって許可されていない属性を含むことはできません。

interface Search { 
    _id?: string; 
    people?: number; 
    partyName?: string; 
    additionalFields?: { [key: string]: any }; 
} 
search({ people: 2 }); // ok 
search({ _id: "jd", people: 2 }); // ok 
search({ _id: "jd", additionalFields: { otherField: "foo" } }); // ok 
:あなたは anyタイプについてできることは何も事実上存在しないため

は、私の勧告は、追加属性のオプションを定義することで、このタイプセーフな方法を解決することです

関連する問題