Typescript检查对象是否与类型匹配

mario595

我有以下问题。假设我有一个类型:

type A = {
    prop1: string,
    prop2: {
        prop3: string
    }
}

我从外部服务接收到一些json对象,我想验证该json是否与type相匹配A

function isA(obj:any): boolean {
    // What should be here?
}

所以,如果我obj是这样的:

{
 prop1: "Hello",
 prop2: {
    prop3: "World"
 }
}

要么

{
     prop1: "Hello",
     prop2: {
        prop3: "World"
     },
     moreProps: "I don't care about"
}

该函数将返回true,但对于诸如以下内容则返回false

{
     foo: "Hello",
     bar: {
        prop3: "World"
     }
}

最简单的方法是什么?

谢谢。

卡西伯
  1. 使用类型保护,以便Typescript还会在类型检查时为您缩小类型

要使用类型保护,您应该将isA函数的返回类型更改obj is A

总的来说,应该使类型验证功能看起来像:

function isA(obj: unknown): obj is A {
    // return boolean here
}
  1. 使用typeof运算符检查属性

typeof将返回一个字符串值,告诉您变量的类型是什么。docs

在这种情况下,对于A,您可以执行以下操作:

function isA(obj: unknown): obj is A {
    return (
        obj &&
        typeof obj === 'object' &&
        typeof obj['prop1'] === 'string' &&
        obj['prop2'] &&
        typeof obj['prop2'] === 'object' &&
        typeof obj['prop2']['prop3'] === 'string'
    );
}

这不是世界上最易读的东西,您可以随时将其分解为各个组成部分,并在需要时对每个检查进行注释。

但是,要注意的一件事是,typeof null实际上'object'您不能简单地检查是否typeof obj['prop2'] === 'object'继续,就必须检查它是否存在,因为它仍然可能存在null

在这一点上,你不仅会被正确地在运行时验证,但现在的打字原稿将能够通过缩小型的,以提高其类型检查objAisA返回true。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章