1

モジュールを複数のファイルに分割しようとしています。私はこの質問に従いましたが、運が悪かったので、同じモジュール内の別のファイルにあるクラスにアクセスできないようです。

Visual Studio 2012 用の TypeScript 0.8.2 プラグインを使用しています

/* 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

1 に答える 1

4

原則として、宣言以外のものを含むファイルにimport/exportをタグ付けして一致させないでください (つまり、コード内で/を使用する場合はファイルのみを参照してください)。あなたが望むのはこれです(追加/削除を参照):/// <reference>.d.tsimportexportNB

/* 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;
        }
    }
}
于 2013-02-03T01:25:47.163 に答える