如何安全地使 Typescript 与自定义后端 API 配合使用

问题描述 投票:0回答:4

我在我的应用程序中使用 API 端点路由。在这些端点中,有关数据的 http 请求由后端在 PRISMA ORM 的帮助下进行处理。

但是,我必须在前端使用其他东西,并开始编写类似于我的后端类型的打字稿类型。对于像 Haskell 或其他类型语言这样的编程语言来说,这是非常违反直觉的。

端点似乎位于中间,并且是未来可能出现的各种不兼容性的根源。因为现在我有 3 个故障点,端点、API 和前端打字稿类型(甚至在运行时都没有编译和可用。)

是否有更类型安全的方法来修复中间端点问题?

我看过几个不起眼的全栈项目,例如 Urweb 和不太晦涩的 Django,但它们缺乏表达性的模板语言,例如 Svelte 或 Vue。还有其他方法可以制作自动类型安全的 api 端点代码吗?

django typescript api vue.js svelte
4个回答
2
投票

这似乎是一个单一事实来源的问题。有多种方法可以解决此类问题。

例如:您可以从模式生成类型(例如从 Swagger 或 Prisma 本身)。或者甚至从 Typeorm 等类型生成模式。

swagger-typescript-api
swagger-typescript-codegen
等工具可以生成用于执行请求并解析请求的代码


0
投票

我不是通过在前端生成类型来解决问题的,而是通过

  1. 简化 Prisma 架构文件,因此我不需要复杂的类型
  2. 在后端制作辅助函数以避免长数据库查询
  3. 编写 Svelte 路由端点作为前端和后端之间的网关,调用后端辅助函数
  4. 在前端编写简单的辅助函数,仅使用@prisma/client 中类型定义提供的标量类型信息。

剩下的最大困难是保持前端、端点和后端的独立性和可维护性。


0
投票

注:我是Remult的作者之一

您可以使用 Remult 从 TypeScript 模型类创建类型安全的 API 端点,而无需生成任何代码。它还具有一个 API 客户端,您可以直接从前端代码使用它来查询和操作数据,而无需任何辅助函数。


0
投票

您可以通过在函数上使用 typeof 从对 prisma 的特定调用中获取类型:

export const loadJobs = async () => {
    return await prisma.jobPost.findMany({
        take: 5,
        orderBy: {
            postDate: 'desc'
        },
        where: {
            published: true
        },
        include: {
            address: true
        }
    });
};
 type ThenArg<T> = T extends PromiseLike<infer U> ? U : T;

export type Jobs = ThenArg<ReturnType<typeof loadJobs>>;

有关此的更多信息可以找到:这里

了解棱镜类型:此处

这也可能是类似的问题:这里

© www.soinside.com 2019 - 2024. All rights reserved.