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')代码>那就行了!非常感谢。