我将现有的Node.js项目转换为完全基于TypeScript的项目。我以前有一个静态Sql
类(一个对象包含含有MySQL帮助函数的子对象)。一个例子是Sql.user.findById
。 Sql
类还具有执行原始MySQL查询的query
函数,无需公开底层的MySQL连接。TypeScript在单独文件中嵌套命名空间
我现在想是一个包含query
功能命名Sql
命名空间,然后在用于包含子类的文件,我想命名空间,如Sql.User
,出口功能,如findById
。
问题是,我不知道如何嵌套这样的命名空间,同时能够访问嵌套命名空间中的query
。
现在我已经是这样的:
sql.ts
:
import * as connection from "./connection";
export * from "./queries/confirmEmail";
export * from "./queries/resetPassword";
export * from "./queries/user";
namespace Sql {
export function query(...args: any[]) {
return connection.query(args);
}
export class Errors {
static confirmCodeExpired = "45001";
static confirmCodeNonExistent = "45002";
static userAlreadyConfirmed = "45003";
}
}
./queries/resetPassword.ts
:
import "../sql";
namespace Sql.ResetPassword {
type InsertCodeArgs = {
code: string;
userid: number;
canChange: boolean;
}
export function insertCode(args: InsertCodeArgs, cb: Nodeback<void>) {
Sql.query(
"CALL insert_reset_code(:code, :userid, :canChange);",
{
code: args.code,
userid: args.userid,
canChange: args.canChange ? 1 : 0
},
cb
);
}
export function removeCode(code: string, cb: Nodeback<void>) {
Sql.query(
"DELETE FROM `resetcodes` WHERE `code` = :code;",
{ code: code },
cb
);
}
export function checkCodeValid(code: string, cb: Nodeback<boolean>) {
Sql.query(
[
"SELECT NOW() <= `c`.`expires` AS `valid`, `c`.`canchange` as `canchange`, `u`.`id` AS `userid` FROM `resetcodes` AS `c` ",
"INNER JOIN `users` AS `u`",
"ON `u`.`id` = `c`.`userid`",
"WHERE `code` = :code LIMIT 1;"
].join(" "),
{ code: code },
(err, data) => {
if (err) return cb(err);
if (!data || data.length === 0) return cb(null, null);
return cb(null, data[ 0 ].valid > 0, data[ 0 ].userid, data[ 0 ].canchange > 0);
}
);
}
};
当我尝试和编译,但是,我得到了一些错误,看起来像这样:
src\sql\queries\resetPassword.ts(11,13): error TS2339: Property 'query' does not exist on type 'typeof Sql'.
如何从父文件“反向引用”查询功能?我当然不能import { Sql } from "../sql"
,因为那么Sql
是一个重复的定义,并且我得到一个错误src/sql/sql.ts has no exported member "Sql"
。
只是想知道为什么你使用命名空间,而不是模块? –
我不确定如何在TypeScript中使用模块,所以如果这是更好的方法,我完全可以接受。 这是所有在Node意义上的一个“模块”(整个项目的一个package.json);我正在思考C#意义上的命名空间的更多内容,其中包含所有SQL代码的子命名空间。 – briman0094
你还可以在'js'中发布你现有的'node.js'代码吗?我会明天去看看 –