javascript - 如何使用类型捕获无效的序列化数据输入
问题描述
即使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);
process
如果传入的字符串数据不包含ID
所需的属性,如何编辑函数以使其出错type MyRequest
?
解决方案
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);
推荐阅读
- python - 旋转组件加载矩阵
- c# - How can I use a Grid View OnRowEditing Event Handler to allow specific cells in the grid view to be edited?
- android - 使用 2 种不同的 listitem 时,Listview 的 getView() 无法正常工作
- java - 如何选择带有离子和appium
- machine-learning - 为什么我的验证准确性差异如此之大?
- python-3.x - Elasticsearch:获取python3中的所有消息(超过10000条)
- amazon-textract - 用于 Amazon Textract 的 Restful API - 示例
- java - 为什么他们从 Spring Framework 5 中删除了对 VelocityEngineUtils 的支持?
- angular - 在Angular中使用量角器时如何测试包含项目的表格
- c# - Xunit Debug 不稳定