2017-03-02 74 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导入。我需要为此创建另一个问题。