我正在尝试在我的代码中从请求主体(使用主体解析器中间件)快速转换为接口(interface),但它没有强制类型安全。
这是我的界面:
export interface IToDoDto {
description: string;
status: boolean;
};
这是我尝试进行转换的代码:
@Post()
addToDo(@Response() res, @Request() req) {
const toDo: IToDoDto = <IToDoDto> req.body; // <<< cast here
this.toDoService.addToDo(toDo);
return res.status(HttpStatus.CREATED).end();
}
最后,调用的服务方法:
public addToDo(toDo: IToDoDto): void {
toDo.id = this.idCounter;
this.todos.push(toDo);
this.idCounter++;
}
我可以传递任何参数,甚至是与接口(interface)定义不相符的参数,并且这段代码可以正常工作。我希望,如果从响应体到接口(interface)的转换是不可能的,因为在运行时会像 Java 或 C# 一样抛出异常。
我读到在 TypeScript 中不存在转换,只有类型断言,所以它只会告诉编译器一个对象是 x
类型,所以...我错了吗?执行和确保类型安全的正确方法是什么?
最佳答案
javascript 中没有强制转换,因此如果“强制转换失败”则不能抛出。
typescript supports casting但这只是编译时间,你可以这样做:
const toDo = <IToDoDto> req.body;
// or
const toDo = req.body as IToDoDto;
您可以在运行时检查该值是否有效,如果无效则抛出错误,即:
function isToDoDto(obj: any): obj is IToDoDto {
return typeof obj.description === "string" && typeof obj.status === "boolean";
}
@Post()
addToDo(@Response() res, @Request() req) {
if (!isToDoDto(req.body)) {
throw new Error("invalid request");
}
const toDo = req.body as IToDoDto;
this.toDoService.addToDo(toDo);
return res.status(HttpStatus.CREATED).end();
}
编辑
正如@huyz 指出的那样,不需要类型断言,因为 isToDoDto
是类型保护,所以这应该足够了:
if (!isToDoDto(req.body)) {
throw new Error("invalid request");
}
this.toDoService.addToDo(req.body);
关于object - 将对象转换为 TypeScript 中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43894565/