首页 > 解决方案 > 如何使用类型捕获无效的序列化数据输入

问题描述

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

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);

process如果传入的字符串数据不包含ID所需的属性,如何编辑函数以使其出错type MyRequest

标签: javascriptnode.jstypescript

解决方案


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);

推荐阅读