我正在将现有的Node.js项目转换为完全基于TypeScript的。我之前有一个静态Sql
类(一个包含MySQL辅助函数的子对象的对象)。一个例子是Sql.user.findById
。 Sql
类还具有query
函数,用于执行原始MySQL查询,而无需公开底层MySQL连接。
我现在想要的是一个名为Sql
的名称空间,其中包含query
函数,然后在用于包含子类的文件中,我希望名称空间如{{1}导出函数如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
的错误。
答案 0 :(得分:1)
我通过别名导入子命名空间文件中的父命名空间来解决我的命名空间引用问题:
CSRF_TOKEN
这允许import { Sql as sql } from "../sql";
...
namespace Sql.User {
export function ... {
sql.query(...);
}
}
命名空间使用来自另一个文件的Sql.User
命名空间中的函数。我仍然不知道如何将命名空间合并为一个,以便只需导入Sql
即可导入Sql.User
及其兄弟姐妹。我需要为此创建另一个问题。