web-dev-qa-db-fra.com

Vérification typographique si la propriété dans l'objet de manière sécurisée

Le code

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

N'est pas TypeScript (pas d'erreur). Je vois pourquoi cela pourrait être. De plus, dans TS 2.8.1 "in" sert de garde de type.

Mais néanmoins, existe-t-il un moyen de vérifier si une propriété existe, mais une erreur si la propriété n'est pas définie dans l'interface d'obj?

interface Obj{
   a: any;
}

Je ne parle pas de vérifier l'indéfini ...

8
cdbeelala89

Vous n'obtenez pas d'erreur car vous utilisez une chaîne pour vérifier si la propriété existe.

Vous obtiendrez l'erreur de cette façon:

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

Si vous souhaitez que la vérification de type fonctionne pour les propriétés de chaîne, vous pouvez ajouter signatures d'index à l'aide de cet exemple

3
Kokodoko

La fonction handle suivante vérifie les types de réponses hypothétiques du serveur en toute sécurité:

/**
 * 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);
}

Playground Link . La fonction has devrait probablement être conservée dans un module utilitaire séparé.

0
quasiyoke