我正在将现有的 Node.js 项目转换为完全基于 TypeScript 的项目。我以前有一个静态Sql类(一个包含 MySQL 辅助函数的子对象的对象)。一个例子是Sql.user.findById。该Sql班也有一个query用于执行原MySQL的查询,而无需露出下面的MySQL连接功能。
我现在想要的是一个Sql包含query函数的命名空间,然后在用于包含子类的文件中,我想要诸如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"当然不能,因为 thenSql是一个重复的定义,并且我收到一个错误src/sql/sql.ts has no exported member "Sql".
我通过在子命名空间文件中别名导入父命名空间解决了我的命名空间引用问题:
import { Sql as sql } from "../sql";
...
namespace Sql.User {
    export function ... {
        sql.query(...);
    }
}
这允许Sql.User命名空间使用Sql来自另一个文件的命名空间中的函数。我仍然不知道如何将命名空间合并为一个,以便Sql.User只需通过导入sql.ts. 我需要为此创建另一个问题。
| 归档时间: | 
 | 
| 查看次数: | 2633 次 | 
| 最近记录: |