javascript - Hur man fångar ogiltig serialiserad dataingång med typer
Även när type MyRequest kräver attributet ID kan funktionen process deklarera variabeln av typen MyRequest även när attributet ID saknas:
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);
Hur redigerar man funktionen process så att den ger ett fel om den inkommande strängdatan inte innehåller ID-attributet som krävs av type MyRequest?
Svar #1
JSON.parse är en JavaScript-funktion, ditt gränssnitt är TypeScript. JavaScript har inget sätt att interagera med gränssnittet vid körning för att säkerställa att alla egenskaper på ditt gränssnitt finns när man parser, så det kan inte generera ett fel på det sätt som ditt exempel visar.
För att göra detta skulle du behöva ha JavaScript-kontroller som verifierar att din parsade JSON stämmer överens med vad som förväntas. Något i stil med
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);
