object - 将对象转换为 TypeScript 中的接口(interface)

标签 object typescript interface casting

我正在尝试在我的代码中从请求主体(使用主体解析器中间件)快速转换为接口(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/

相关文章:

java - 绘制简单的形状 -> JavaFX 的绘制方法和接口(interface)

javascript - 迭代地添加到 Javascript 中的对象数组

c++ - 当我尝试使用指针打印数组元素时打印垃圾值

javascript - Angular 4 : How to watch an object for changes?

javascript - NestJs 验证管道无法正常工作

javascript - react Antd : How to remove spacing between vertical divider and any content right next to it?

python 字符串函数不适用于具有数据类型对象的列

python - 使用对象调用函数?

在界面中使用枚举的 typescript

Java 反射 : Call method from Interface name