我有以下问题。假设我有一个类型:
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"
}
}
最简单的方法是什么?
谢谢。
答案 0 :(得分:1)
要使用类型保护,应将isA
函数的返回类型更改为obj is A
应该使您的类型验证功能完整的整体外观
function isA(obj: unknown): obj is A {
// return boolean here
}
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。