Javascript 如何在运行时检查类';是否允许s字段为空/未定义,以验证JSON?
假设我有一个这样的物体:Javascript 如何在运行时检查类';是否允许s字段为空/未定义,以验证JSON?,javascript,json,typescript,Javascript,Json,Typescript,假设我有一个这样的物体: class MyObject { requiredString: string, nullableString: string | undefined } 我希望能够将JSON反序列化到这个对象中,同时强制它具有所需的字符串,而不是强制它具有可为空的字符串 因此,所有这些测试都应通过: const validJson1 = '{"requiredString":"a needed value!","nullableString":"an unneede
class MyObject {
requiredString: string,
nullableString: string | undefined
}
我希望能够将JSON反序列化到这个对象中,同时强制它具有所需的字符串,而不是强制它具有可为空的字符串
因此,所有这些测试都应通过:
const validJson1 = '{"requiredString":"a needed value!","nullableString":"an unneeded value!"}'
const validJson2 = '{"requiredString":"whatever!"}'
const invalidJson = '{"nullableString":"I am the God Of Teeth!"}'
class MyObject {
requiredString: string,
nullableString: string | undefined
}
function myMagicValidator<T>( objectInstance:T ) {
// Throws exception if objectInstance is not a valid <T>
}
test('works whatsoever', () => {
let testObject = JSON.parse(validJson1)
myMagicValidator<MyObject>(testObject)
})
test('respects optional values', () => {
let testObject = JSON.parse(validJson2)
myMagicValidator<MyObject>(testObject)
})
test('enforces required values', () => {
let testObject = JSON.parse(invalidJson)
expect(myMagicValidator<MyObject>(testObject)).toThrow()
})
// Ideally this could work too, but it's not strictly needed
const invalidJson2 = '{"requiredString":5,"nullableString":"another value!"}'
test('enforces type safety', () => {
let testObject = JSON.parse(invalidJson2)
expect(myMagicValidator<MyObject>(testObject)).toThrow()
})
const validJson1='{“requiredString”:“需要的值!”,“nullableString”:“不需要的值!”)
const validJson2='{“requiredString”:“随便!”
const invalidJson='{“nullableString”:“我是牙齿之神!”)
类MyObject{
requiredString:string,
nullableString:字符串|未定义
}
函数myMagicValidator(objectInstance:T){
//如果objectInstance不是有效的
}
测试('无论如何都有效',()=>{
让testObject=JSON.parse(validJson1)
myMagicValidator(testObject)
})
测试('尊重可选值',()=>{
让testObject=JSON.parse(validJson2)
myMagicValidator(testObject)
})
测试('强制要求的值',()=>{
让testObject=JSON.parse(invalidJson)
expect(myMagicValidator(testObject)).toThrow()
})
//理想情况下,这也能起作用,但这不是严格需要的
const invalidJson2='{“requiredString”:5,“nullableString”:“另一个值!”}'
测试('强制类型安全',()=>{
让testObject=JSON.parse(invalidJson2)
expect(myMagicValidator(testObject)).toThrow()
})
但诀窍在于我并不拥有这个对象,MyObject实际上是从另一个包导入的,在我的代码中是不可修改的。要求是,如果向MyObject添加了另一个需要的字段,myMagicValidator应该在节点模块更新以包含新字段时自动开始检查它。TypeScript本质上是静态的。这些类型在编译时被剥离,在运行时不存在,因此您无法在运行时检查对象形状。对于运行时检查,只需使用JS代码
function myMagicValidator<T>( objectInstance:T ) {
if (!Reflect.has(objectInstance, 'requiredString')) {
throw new Error('Missing requiredString');
}
}
函数myMagicValidator(objectInstance:T){
如果(!Reflect.has(objectInstance,'requiredString')){
抛出新错误(“缺少requiredString”);
}
}
注意:根据您的需要(和语法首选项),您还可以使用或检查属性是否存在。当前的顶部答案是正确的。我建议使用
iots
在运行时执行此类验证,尤其是当要验证的形状比单个js检查更复杂时。例如,请看我的答案。io ts的好处在于,无论验证有多复杂,如果成功,最终都会得到静态类型保证。问题是,如何在运行时获得所需字符串列表?您需要定义一个运行时类型,然后自己进行验证。有许多lib可用于此目的,ineidea类似于React中的proptypes、json-gate等