2017-03-02 76 views
0

我將現有的Node.js項目轉換爲完全基於TypeScript的項目。我以前有一個靜態Sql類(一個對象包含含有MySQL幫助函數的子對象)。一個例子是Sql.user.findByIdSql類還具有執行原始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"

+0

只是想知道爲什麼你使用命名空間,而不是模塊? –

+0

我不確定如何在TypeScript中使用模塊,所以如果這是更好的方法,我完全可以接受。 這是所有在Node意義上的一個「模塊」(整個項目的一個package.json);我正在思考C#意義上的命名空間的更多內容,其中包含所有SQL代碼的子命名空間。 – briman0094

+0

你還可以在'js'中發佈你現有的'node.js'代碼嗎?我會明天去看看 –

回答

1

我解決我的命名空間引用問題,通過別名進口父命名空間中的孩子命名空間中的文件:

import { Sql as sql } from "../sql"; 

... 

namespace Sql.User { 
    export function ... { 
     sql.query(...); 
    } 
} 

這使得Sql.User命名空間中Sql命名空間使用功能,從另一個文件。我仍然不知道如何將命名空間合併爲一個,這樣Sql.User及其兄弟可以簡單地通過導入sql.ts導入。我需要爲此創建另一個問題。