TypeScript嵌套命名空间位于单独的文件中

时间:2017-03-02 18:13:56

标签: node.js typescript

我正在将现有的Node.js项目转换为完全基于TypeScript的。我之前有一个静态Sql类(一个包含MySQL辅助函数的子对象的对象)。一个例子是Sql.user.findByIdSql类还具有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的错误。

1 个答案:

答案 0 :(得分:1)

我通过别名导入子命名空间文件中的父命名空间来解决我的命名空间引用问题:

CSRF_TOKEN

这允许import { Sql as sql } from "../sql"; ... namespace Sql.User { export function ... { sql.query(...); } } 命名空间使用来自另一个文件的Sql.User命名空间中的函数。我仍然不知道如何将命名空间合并为一个,以便只需导入Sql即可导入Sql.User及其兄弟姐妹。我需要为此创建另一个问题。