コード
const obj = {};
if ('a' in obj) console.log(42);
TypeScriptではありません(エラーなし)。なぜそうなのかわかります。さらに、TS 2.8.1では、「in」はタイプガードとして機能します。
しかし、それでも、プロパティが存在するかどうかを確認する方法はありますが、プロパティがobjのインターフェイスで定義されていない場合はエラーになりますか?
interface Obj{
a: any;
}
私は未定義のチェックについて話していません...
文字列を使用してプロパティが存在するかどうかを確認するため、エラーは発生しません。
この方法でエラーが発生します。
interface Obj{
a: any;
}
const obj: Obj = { a: "test" };
if (obj.b) // this is not allowed
if ("b" in obj) // no error because you use string
タイプチェックを文字列プロパティに対して機能させる場合は、 この例を使用したインデックスシグネチャ を追加できます。
次のhandle
関数は、架空のサーバー応答のタイプセーフな方法をチェックします。
/**
* A type guard. Checks if given object x has the key.
*/
const has = <K extends string>(
key: K,
x: object,
): x is { [key in K]: unknown } => (
key in x
);
function handle(response: unknown) {
if (
typeof response !== 'object'
|| response == null
|| !has('items', response)
|| !has('meta', response)
) {
// TODO: Paste a proper error handling here.
throw new Error('Invalid response!');
}
console.log(response.items);
console.log(response.meta);
}
プレイグラウンドリンク 。関数has
は、おそらく別のユーティリティモジュールに保存する必要があります。