Typescript的模块

Typescript中的“内部模块”现在称作“命名空间”,“外部模块”称作“模块”。

模块在其自身的作用域里执行,而不是在全局作用域里。这意味着定义在一个模块里的变量、函数、类等在模块外部是不可见的,除非你明确地使用export形式之一导出它们。相反,如果想使用其他模块导出的变量、函数、类、接口等等的时候,你必须要导入它们,可以使用import形式之一。

我们可以把一些公共的功能单独抽离成一个文件作为一个模块。

编写模块并导出

编写模块 modules/db.ts:

  1. // 使用export暴露dbURL变量
  2. export var dbURL = 'XXXXX';
  3. // 使用export将getData方法声明出去
  4. export function getData():any[] {
  5. console.log('获取数据库的数据');
  6. return [
  7. {
  8. title:'123'
  9. },
  10. {
  11. title:'234'
  12. }
  13. ]
  14. }
  15. // 使用export暴露save函数
  16. export function save():void {
  17. console.log('保存数据库数据');
  18. }

模块的第二种写法:

  1. var dbURL = 'XXXXX';
  2. function getData():any[] {
  3. console.log('获取数据库的数据');
  4. return [
  5. {
  6. title:'123'
  7. },
  8. {
  9. title:'234'
  10. }
  11. ]
  12. }
  13. function save():void {
  14. console.log('保存数据库数据');
  15. }
  16. // 使用export统一暴露变量、函数
  17. // export可以使用多次,即
  18. // export {dbURL}
  19. // export {getData}
  20. // 导出时重命名
  21. // export { getData as data }
  22. // 导出扩展的其他模块
  23. // export {ZipCodeValidator as RegExpBasedZipCodeValidator} from "./ZipCodeValidator";
  24. // 导出扩展的其他模块的所有导出的内容
  25. // export * from "./ZipCodeValidator";
  26. export {dbURL,getData,save}

导入模块

编写ts程序,引入db.ts模块

  1. // 使用import引入模块中需要用到的函数、变量名,模块路径不写.ts
  2. // 使用 as 为某个变量或函数名重新命名一个别名
  3. import {getData,dbURL,save as sa} from './modules/db'
  4. // 将整个模块导入到一个变量
  5. // import * as validator from "./ZipCodeValidator";
  6. // 正常调用db.ts中的getData、save方法
  7. getData();
  8. sa();

编写好的ts模块,经过编译后,生成的js中含有export、require关键字,在浏览器中不能直接运行。需要再经过编译或者使用nodejs运行。

使用nodejs运行生成的js:

  1. cd js
  2. node index.js

默认引入:

  1. // 默认引入时,使用export default声明
  2. var dbURL = 'XXXXX';
  3. function getData():any[] {
  4. console.log('获取数据库的数据');
  5. return [
  6. {
  7. title:'123'
  8. },
  9. {
  10. title:'234'
  11. }
  12. ]
  13. }
  14. function save():void {
  15. console.log('保存数据库数据');
  16. }
  17. // 使用export default暴露一个函数或变量
  18. // export default在一个模块中只能使用一次
  19. export default getData;

引入export default:

  1. // export default声明的模块函数,引入时不加大括号
  2. import getData from './modules/db'
  3. getData;

require导入模块

为了支持CommonJS和AMD的exports, TypeScript提供了export =语法。

export =语法定义一个模块的导出对象。 这里的对象一词指的是类,接口,命名空间,函数或枚举。

若使用export =导出一个模块,则必须使用TypeScript的特定语法import module = require("module")来导入此模块。

外部模块

要想描述非TypeScript编写的类库的类型,我们需要声明类库所暴露出的API。

我们叫它声明因为它不是“外部程序”的具体实现。 它们通常是在 .d.ts文件里定义的。 如果你熟悉C/C++,你可以把它们当做 .h文件。 类似Java的Interface。

例如:node.d.ts

  1. declare module "url" {
  2. export interface Url {
  3. protocol?: string;
  4. hostname?: string;
  5. pathname?: string;
  6. }
  7. export function parse(urlStr: string, parseQueryString?, slashesDenoteHost?): Url;
  8. }
  9. declare module "path" {
  10. export function normalize(p: string): string;
  11. export function join(...paths: any[]): string;
  12. export let sep: string;
  13. }

现在我们可以/// node.d.ts并且使用import url = require("url");import * as URL from "url"加载模块。

  1. /// <reference path="node.d.ts"/>
  2. import * as URL from "url";
  3. let myUrl = URL.parse("http://www.typescriptlang.org");