2
var opts: {n?: number; s?: string;};
opts = {n: 2};     // Ok
opts = {s: 'x'};   // Ok
opts = {};         // Ok
opts = {z: 3};     // Ok, but shouldn't this be an error?

オブジェクトが宣言されたオプションのプロパティをまったく受け入れないようにしたいのですoptsが (その他は受け入れません)、他の未定義のプロパティを受け入れます。つまり、宣言は と同等opts: {};です。これはバグですか?

バグでない場合、どうすればそのような宣言を作成できますか?

4

1 に答える 1

2

TypeScript の優れた点の 1 つは、オブジェクトを別の型に強制できるかどうかを非常に巧妙に判断できることです。

両方のプロパティがオプションであるため、宣言にはopts実際には要件がありません。したがって、任意のオブジェクトはこのタイプと互換性があります。互換性を保つには、オブジェクトに必要なすべてのプロパティが含まれている必要があります。この場合、必要なプロパティはありません。

プロパティを必要とする調整された例を見ると、これはより明確になります。

var opts: {a: bool; n?: number; s?: string;};

opts = {a: true, n: 2};     // Ok
opts = {a: true, s: 'x'};   // Ok
opts = {a: true};         // Ok
opts = {a: true,z: 3};     // Ok
opts = {}; // not ok
opts = {z: 3}; // not ok

つまり、オブジェクトが少なくとも必要なプロパティをサポートしている場合、オブジェクトは別のオブジェクトのサブタイプと見なされます。

それはオブジェクトの設定を扱います。オブジェクトの使用を検討すると、その力がどこにあるのかがわかります。nこの型は and のみを約束するためs(そしてa私の例では)、 on のプロパティを呼び出すコードnはこれらのプロパティのみを要求できます。追加のプロパティにはアクセスできません:

var opts: {a: bool; n?: number; s?: string;};

opts = {a: true, n: 1, s: 'Hi', z: 3};

var x - opts.z; // not ok

したがって、追加のプロパティではなく、型宣言のプロパティのみを使用できるため、型の安全性は維持されます。

于 2012-11-03T22:35:51.050 に答える