打字稿检查对象是否与类型

时间:2019-05-17 15:42:15

标签: 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"
}

该函数将返回true,但对于诸如此类的返回false

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

最简单的方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

  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

这时,您不仅可以在运行时正确验证,而且TypeScript现在可以通过将{{1}时的obj的类型缩小为A来改善其类型检查。 }返回true。