Javascript 如何捕获类型为的无效serlialized数据输入

Javascript 如何捕获类型为的无效serlialized数据输入,javascript,node.js,typescript,Javascript,Node.js,Typescript,即使type MyRequest需要ID属性,函数process也能够声明MyRequest类型的变量,即使ID属性缺失: export type MyRequest = { ID: string, Name?: string }; function process(jsonData:string) { try { let data: MyRequest = JSON.parse(jsonData); return data } catch

即使
type MyRequest
需要
ID
属性,函数
process
也能够声明
MyRequest
类型的变量,即使
ID
属性缺失:

export type MyRequest = 
  {
    ID: string, 
    Name?: string
  };

function process(jsonData:string) {
  try {
    let data: MyRequest = JSON.parse(jsonData);
    return data
  } catch (err) {
    console.log("Error:", err)
  }
}

let jsonData = JSON.stringify( { foo: "bar" } );
let result = process(jsonData);
console.log(result);

如何编辑函数
进程
,以便在传入的字符串数据不包含
类型MyRequest所需的
ID
属性时出错?

JSON。parse
是一个JavaScript函数,您的接口是TypeScript。JavaScript无法在运行时与接口交互,以强制在解析时接口上的所有属性都存在,因此它不能以您展示示例的方式产生错误

为了做到这一点,您需要进行JavaScript检查,以验证解析的JSON是否符合预期。差不多

export type MyRequest = 
  {
    ID: string, 
    Name?: string
  };

function isMyRequest(json: any): json is MyRequest {
    return json && Object.prototype.hasOwnProperty.call(json, 'ID');
}

function process(jsonData:string) {
  try {
    let data: MyRequest = JSON.parse(jsonData);
    if (!isMyRequest(data)) {
        throw new Error('invalid jsonData');
    }
    return data;
  } catch (err) {
    console.log("Error:", err)
  }
}

let jsonData = JSON.stringify( { foo: "bar" } );
let result = process(jsonData);
console.log(result);

该解决方案需要另外7行代码。有什么方法可以简化它吗?您可以将
isMyRequest
函数体内联到
if
中,并将
if
语句体折叠到同一行:
if(!data | |!Object.prototype.hasOwnProperty.call(data,'ID'))抛出新错误('invalid jsonData')那就行了!非常感谢。