typescript 检查对象是否匹配类型

标签 typescript

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

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

我从外部服务接收一些 json 对象,我想验证该 json 是否匹配类型 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"
}

该函数将返回真,但对于类似的东西会返回假
{
     foo: "Hello",
     bar: {
        prop3: "World"
     }
}

实现这一目标的最简单方法是什么?

谢谢。

最佳答案

  • 使用类型保护,这样 Typescript 也会在类型检查时为你缩小类型

  • 要使用类型保护,您应该更改 isA 的返回类型。函数为 obj is A
    总的来说,这应该让你的类型验证函数看起来像:
    function isA(obj: unknown): obj is A {
        // return boolean here
    }
    
  • 使用 typeof运算符(operator)检查属性
  • 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 .

    此时,您不仅可以在运行时正确验证,而且 TypeScript 现在可以通过缩小 obj 的类型来改进其类型检查。至 AisA返回真。

    关于 typescript 检查对象是否匹配类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56189690/

    相关文章:

    typescript - Typescript 中的类型和类有什么区别?

    node.js - 如何在 Express 应用程序中使用 DefinelyTyped 定义

    angularjs - ngRepeat 暂时显示重复列表

    javascript - 从剪贴板 Angular 粘贴图片

    node.js - Typescript Google API 编译错误

    typescript - 点燃元素\lib\decorators.js : Unexpected token error

    javascript - 如何在 TypeScript (CommonJS) 中只导出一个类(使用另一个类)?

    javascript - ionic 3 : Cannot read property 'nativeElement' of undefined TypeError: Cannot read property 'nativeElement' of undefined

    angular - 我可以自定义 Angular 全局错误处理程序,使其不仅仅是一个错误参数吗?

    angular - 类型 'json' 上不存在属性 '{}'