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 ...
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
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é.