2013-02-02 19 views
1

我试图将模块拆分为多个文件。我跟着这question,但没有运气,在同一模块但在不同的文件中的类似乎是无法访问我。TypeScript模块与不同文件中的类

我使用打字稿0.8.2插件的Visual Studio 2012

/* filesystem */ 
- /core 
- - Router.ts 
- - Server.ts 
- /DefinitelyTyped 
- - .. 
- index.ts 


/* file Router.ts */ 
///<reference path='../DefinitelyTyped/node/node.d.ts'/> 
import Url = module("url"); 

module Core { 
    export class Router { 
     static route(url: string) { 
      var pathname: string = Url.parse(url).pathname; 
      var query: string = Url.parse(url).query; 
      console.log("About to route to " + pathname); 
     } 
    } 
} 

/* file Server.ts */ 
///<reference path='../DefinitelyTyped/node/node.d.ts'/> 
///<reference path="Router.ts"/> 

import Http = module("http"); 

module Core { 
    export class Server { 

     private server: Http.Server; 
     private port: number; 

     constructor(port: number) { 
      this.port = port; 
      this.server = Http.createServer(this.onRequest); 
      this.server.listen(this.port); 
      console.log("Server started at http://127.0.0.1:" + this.port + "/."); 
     } 

     private onRequest(request: Http.ServerRequest, response: Http.ServerResponse) { 
      var url: string = request.url; 

      console.log("Received request: \"" + request.url + "\"."); 

      Router.route(url); //problem: Name 'Router' doesn't exist in this scope... 

      response.writeHead(200, { "Content-Type": "text/plain" }); 
      response.write(url); 
      response.end(); 
     } 

     public getPort(): number { 
      return this.port; 
     } 
    } 
} 

所以,我缺少什么?

回答

4

作为一般规则,从不混合和/// <reference>标签匹配import/export到包含除声明以外的(如果你在代码中使用import/export随时随地即只引用.d.ts文件)的任何文件。你想要的是这样的(参见NB添加/删除):

/* file Router.ts */ 
///<reference path='../DefinitelyTyped/node/node.d.ts'/> 
import Url = module("url"); 

// NB Removed containing module for clarity 
export class Router { 
    static route(url: string) { 
     var pathname: string = Url.parse(url).pathname; 
     var query: string = Url.parse(url).query; 
     console.log("About to route to " + pathname); 
    } 
} 

/* file Server.ts */ 
///<reference path='../DefinitelyTyped/node/node.d.ts'/> 
// NB Removed reference 

import Http = module("http"); 
import Router = module("./Router"); // NB Added 

module Core { 
    export class Server { 

     private server: Http.Server; 
     private port: number; 

     constructor(port: number) { 
      this.port = port; 
      this.server = Http.createServer(this.onRequest); 
      this.server.listen(this.port); 
      console.log("Server started at http://127.0.0.1:" + this.port + "/."); 
     } 

     private onRequest(request: Http.ServerRequest, response: Http.ServerResponse) { 
      var url: string = request.url; 

      console.log("Received request: \"" + request.url + "\"."); 

      // NB first 'Router' is the import name at the top of this file, feel free to change 
      // NB second'Router' is the name of the class from that module 
      Router.Router.route(url); 

      response.writeHead(200, { "Content-Type": "text/plain" }); 
      response.write(url); 
      response.end(); 
     } 

     public getPort(): number { 
      return this.port; 
     } 
    } 
} 
+0

因此,类似于Java的封装是不可能的? – blootoon

+0

我不明白。 'Router.Router'太难看了。此外,@ blootoon最初做的是在单独文件的教程中看到[这里](http://www.typescriptlang.org/Handbook#modules-splitting-across-files) – Dmitry

相关问题