我有以下问题。假设我有一个类型:
type A = {
prop1: string,
prop2: {
prop3: string
}
}
我从外部服务接收到一些json对象,我想验证该json是否与type相匹配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"
}
}
最简单的方法是什么?
谢谢。
要使用类型保护,您应该将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
。
在这一点上,你不仅会被正确地在运行时验证,但现在的打字原稿将能够通过缩小型的,以提高其类型检查obj
到A
时isA
返回true。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句