2017-06-20 9 views
8

私はTypeScriptバージョン2.3.4を使用しています。フィールドを指定しなければならないオブジェクトを受け入れる関数を記述したいと思います。しかし、このオブジェクトは他のフィールドを含むべきではありません。どうすればこれを達成できますか?TypeScript strict class/interface

これはオブジェクトインラインを定義する場合にのみ機能します。しかし、余分なフィールドを持つ別のオブジェクトを使用すると、コンパイラはそれを許可します。何が完全に間違っている。

例:

function foo(arg: { a: string }) { // there is tons of fields actually 
    // ... 
} 

foo ({a: "qwerty"}); // No Error - ok 

foo ({a: "qwerty", b: 123}); // Error - ok 

let bar = { 
    a: "qwerty", 
    b: 123 
}; 

foo (bar); // No Error - NOT OK !!! 

同じコードがインターフェイス、クラス、型宣言でwritedすることができる - それは同じ問題です。

これで、オブジェクトから手動でフィールドを抽出して、余分なフィールドがないことを確認する必要がありました。しかし、私はこのソリューションを〜1000の関数に広めることはできません(私は本当にこれが必要です)。私はAPIラッパーを作成し、サーバーに渡された追加または間違ったフィールドがないことを確認する必要があります。

+0

意図的です。詳細については、[この問題](https://github.com/Microsoft/TypeScript/issues/13444)および[this](https://github.com/Microsoft/TypeScript/issues/3755)を参照してください。 – Saravana

+0

サラバナ、ええ、私はこれを読んでいますが、私の質問には答えていません。私はインターフェイスの厳密性を避ける方が良いと思いますが、クラスのために残しておいてください。 –

答えて

2

あなたは「exact types」として知られているために求めている機能。
これは拒否も受け入れもされていないと考えられており、議論はまだ続いています。

1

これは設計によって動作する方法であり、私はあなたがこれを回避できるかどうかはわかりません。詳細はSee the docsをご覧ください。

あなたが間違っていることは、サーバーに送信されたものについて100%確実にすることはできません。ブラウザーがTSについて何も知らない限り、いくつかのライブラリーは、必要に応じて任意の要求に注入することができます。 XmlHttpRequestメソッドを上書きします(これは、例えば、少なくともangleのzone.jsのようなものです)。

簡単に意図を破る別の方法は、渡すパラメータの前に<any>を使用するのと同じくらい簡単です。

TypeScriptは開発プロセスを改善することを目的としていますが、あなたのようなニーズには使用できないと思います。これは、通常、適切なテストを書くことによってカバーされます。

+0

もちろん、クラスや型チェックがないJSにJSがコンパイルされていることはわかっています!開発プロセスで他の開発者から自分のメソッドを保護する必要があります。これはすべて開発に関するものです。実際の例: https://codepen.io/HarryBurns/pen/LLWoVa.typescript –

1

方法はありますが、あなたはそれを自分で実装する必要があります。それは、「ユーザー定義型ガード」と呼ばれ、それは次のようになります:

interface Test { 
    prop: number; 
} 

function isTest(arg: any): arg is Test { 
    return arg && arg.prop && typeof(arg.prop) == 'number'; 
} 
+0

Reflectionを使用する方が良いです(http://blog.wolksoftware.com/decorators-metadata-reflection-in-typescript-fromを参照)。 -novice-to-expert-part-4)、それは 'check (myObject)'のような短いものになります。または、私の場合は 'pick (myObject)'です。アンダースコア/ロダッシュの 'pick'関数のように動作します。 –

2

Necromancing。

type foo = { 
    a:string; 
    b:number; 
    opt?:string; 
} 


function test(obj:foo) 
{} 

test({ a:"", b:123, e:"produceError"}); 

そして、それはすべてのパラメータがオプションである場合、オブジェクトの強制する:
それはtypescriptです2.4で来るの

function test(obj:foo & object) 
{} 

そして、あなたは、文字列または別のオブジェクト型のいずれかを渡したい場合は:

function test(obj: string | foo & object) 
{}