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等