gpt4 book ai didi

typescript 检查对象是否匹配类型

转载 作者:行者123 更新时间:2023-12-03 19:29:09 26 4
gpt4 key购买 nike

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

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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com