23

我只是想了解一下 TypeScript,

假设我有一个animals.ts这样的模块:

export module Animals {

    export interface Animal {
        name(): void;
    }

    export class Elephant implements Animal {

        constructor() {

        } 

        public name() {
            console.log("Elephant");
        }
    }

    export class Horse implements Animal {

        constructor() {

        }

        public name() {
            console.log("Horse");
        }
    }
}

我想在另一个文件中使用这个模块animals_panel.ts

import animals = require("animals")

module AnimalPanel {

    var animal = new animals.Animals.Elephant();
    animal.name();
}
  1. 对我来说,我必须使用它似乎有点奇怪animals.Animals.Elephant(),我会预料到的Animals.Elephant()。我做错了什么还是这是正确的行为?
  2. 是否可以import animals = require("animals")在模块内部导入AnimalPanel(尝试执行此操作时出现错误)?
4

2 回答 2

33

当您使用外部模块时,每个文件都是一个模块。因此,例如在文件中声明本地内部模块export module Animals {会导致不必要的双重间接。

我会将animals.ts编码为:

export interface Animal {
    name(): void;
}

export class Elephant implements Animal {

    constructor() {

    } 

    public name() {
        console.log("Elephant");
    }
}

export class Horse implements Animal {

    constructor() {

    }

    public name() {
        console.log("Horse");
    }
}

然后将其用作:

import animals = require("animals")

module AnimalPanel {

    var animal = new animals.Elephant();
    animal.name();
}

PS:关于内部/外部打字稿模块的视频:http ://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1

于 2013-09-01T08:23:14.353 回答
2

您可以使用 2 种类型的语法export/import

  1. RequireES5 支持的(AMD 风格)语法:

    var animals = require("animals");

  2. 使用import从 ES6 开始支持的样式:

    import { Elephant, Horse } from "animals";

TypeScript 支持export =对传统CommonJSAMD工作流程进行建模。所以这两种变体都可以工作,我建议使用第二种,因为它的机制更强大。

关于它的更多细节可以在官方的 TypeScript Modules 网页上找到

于 2016-07-23T05:33:32.797 回答