我有以下问题。假设我有一个类型:
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"
}
}
实现这一目标的最简单方法是什么?
谢谢。
最佳答案
要使用类型保护,您应该更改
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
的类型来改进其类型检查。至 A
当isA
返回真。
关于 typescript 检查对象是否匹配类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56189690/