web-dev-qa-db-ja.com

タイプスクリプトは、オブジェクトのプロパティがタイプセーフな方法かどうかをチェックします

コード

const obj = {};
if ('a' in obj) console.log(42);

TypeScriptではありません(エラーなし)。なぜそうなのかわかります。さらに、TS 2.8.1では、「in」はタイプガードとして機能します。

しかし、それでも、プロパティが存在するかどうかを確認する方法はありますが、プロパティがobjのインターフェイスで定義されていない場合はエラーになりますか?

interface Obj{
   a: any;
}

私は未定義のチェックについて話していません...

8
cdbeelala89

文字列を使用してプロパティが存在するかどうかを確認するため、エラーは発生しません。

この方法でエラーが発生します。

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

タイプチェックを文字列プロパティに対して機能させる場合は、 この例を使用したインデックスシグネチャ を追加できます。

3
Kokodoko

次の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は、おそらく別のユーティリティモジュールに保存する必要があります。

0
quasiyoke