我將現有的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'代碼嗎?我會明天去看看 –