打字稿和 Knex

Posted

技术标签:

【中文标题】打字稿和 Knex【英文标题】:Typescript and Knex 【发布时间】:2021-08-08 18:23:26 【问题描述】:

TypeScript 新手。我正在使用 Express、Postgresql 和 Knex 开发一个节点应用程序,我在某些方面有点困惑,什么时候应该和不应该应用类型定义。我正在查看其他项目以获得一些指导,但我对他们如何接近何时使用类型定义以及何时不使用感到有些困惑。

这是我看到的代码版本。为什么这个人定义一个返回类型 Promise 然后还使用类型转换?你不是只需要函数的返回类型吗?

数据库/index.ts:

export default function startTransaction(): Promise<Knex.Transaction> 
 return new Promise((resolve, reject) => 
 return db
      .transaction((trx) => 
        return resolve(trx);
      )
      .catch(() => 
         reject('unable to complete transaction');
      );
  ) as Promise<Knex.Transaction>

下面的操作是否正确?我将 TypeScript 与 Knex 一起使用只是为了帮助这些查询自动完成?

model/company.ts:

interface Company 
 id: string;
 name: string;
 date_created: Date;


function getCompanies(trx: Knex.Transaction): Knex.QueryBuilder 
 return trx.table<Company>('company').returning('*');

这可能是一个愚蠢的问题,但是对于下面这个控制器,你不需要定义'trx'类型或'companies'类型,因为它们已经在模型中定义了,对吧?

controller/company.ts:

const getCompanies: RequestHandler = async (req, res): Promise<void> => 
 const trx = await startTransaction();

 try 
     const companies = await Test.getCompanies(trx);
     await trx.commit();
     res.status(200).send(companies);
   catch (error) 
     await trx.rollback();
     res.status(500).send(error);
  
;

一般来说,当我查询数据库时,我是否也需要定义数据库返回给我的类型?我知道当我收到客户请求时,我显然需要确保所有这些值的定义与我的数据库定义的完全一致。 谢谢!基本问题,但对我前进并完全理解我应该如何处理项目的这一部分确实很有帮助。

【问题讨论】:

好吧,如果你是新手,我建议不要遵循那些他们使用高级主题的例子,比如你现在可能不需要的数据库事务 【参考方案1】:

为什么这个人定义一个返回类型 Promise 然后还使用类型转换?你不是只需要函数的返回类型吗?

Typescript 可以自动推断返回类型。但是,添加显式返回类型是一种很好的做法。这是因为 Typescript 并不总是知道您希望返回类型是什么。例如,您可能正在实现一个方法来实例化一个具体对象,但您希望返回类型是一个接口或父类。

至于为什么代码使用typecast,是因为你复制的代码是错误的。如果您查看signature of knex.transaction,您会看到它返回Promise&lt;T&gt;,这就是resolve(trx) 返回的内容。所以,是的,不要使用那个代码。这是不对的。 :)

对于下面这个控制器,你不需要定义'trx'类型或'companies'类型,因为它们已经在模型中定义了,对吧?

是的。为const trxconst company 推断类型。

【讨论】:

以上是关于打字稿和 Knex的主要内容,如果未能解决你的问题,请参考以下文章

打字稿和电子出口未定义

NodeJs 打字稿和模块问题

打字稿和正则表达式

打字稿和本机反应的 ForwardRef 错误

打字稿和传播运算符?

打字稿和嵌套解构