全局模块
在默认情况下,在TypeScript 文件中写下的代码,它是处于全局命名空间中:
// 定义的变量、类型等在全局命名空间中const foo = 123;type name = string;
// 可以不用导入而直接引用const bar = foo; // allowedlet xjp: name; // allowed
使用全局变量空间是危险的,因为它会与文件内的代码命名冲突。推荐使用文件模块。
所以一般会见到有的文件模块会导出空的对象:
let name: string = 'xjp' // 如果外面也有其它地方声明了name变量就会报错export {} // 作用,表明这是一个单独的文件模块,里面声明的变量不会共享影响到全局
文件模块
文件模块也被称为外部模块。如果TypeScript 文件里含有 import 或者 export,那么它会在这个文件中创建一个本地的作用域:
// 在全局命名空间里,不再有 fooexport const foo = 123;
// const bar = foo; // ERROR: "cannot find name 'foo'"// 不能再直接使用,而需要导入再使用import { foo } from './foo';const bar = foo; // allow
动态导入表达式
动态导入表达式是 ECMAScript 的一个新功能,它允许你在程序的任意位置异步加载一个模块。
webpack 实现代码分割的方式有两种:使用 import() (首选,ECMAScript 的提案)和 require.ensure() (最后考虑,webpack 具体实现)。
// 懒加载 moment 库,同时也希望使用代码分割的功能,这意味 moment 会被分割到一个单独的 JavaScript文件,当它被使用时,会被异步加载import(/* webpackChunkName: "momentjs" */ 'moment').then(moment => {// 懒加载的模块拥有所有的类型,并且能够按期工作// 类型检查会工作,代码引用也会工作 :100:const time = moment().format();console.log('TypeScript >= 2.4.0 Dynamic Import Expression:');console.log(time);}).catch(err => {console.log('Failed to load moment', err);});
重要的提示
- 使用 “module”: “esnext” 选项:TypeScript 会保留 import() 语句,该语句用于 Webpack Code Splitting。
.d.ts
修改原始类型
在 TypeScript 中,接口是开放式的,这意味着当你想使用不存在的成员时,推荐创建一个称为 global.d.ts 的特殊文件,TypeScript 将会自动接收它。修改添加至 Window,Math,Date,String 的一些例子:
// helloWorld自动添加至全局 Window 接口interface Window {helloWorld(): void;}interface Math {seedrandom(seed?: string): void;}// Date的声明是:declare var Date: DateConstructor;interface DateConstructor {today(): Date}// endsWith自动添加至全局 String 接口interface String {endsWith(suffix: string): boolean;}String.prototype.endsWith = function(suffix: string): boolean {const str: string = this;return str && str.indexOf(suffix, str.length - suffix.length) !== -1;};// 使用:window.helloWorld = () => console.log('hello world');Math.seedrandom('Any string you want');const today = Date.today();console.log('foo bas'.endsWith('bas')); // true
declare
- declare声明的是全局的类型,默认不需要再导出(除非是declare module)可以直接使用;
- declare里不可以再重复declare(除非是declare global)
```typescript
declare type Nullable
= T | null; declare type Recordable = Record ;
// 这样TS就可以识别vue文件 declare module ‘*.vue’ { import { DefineComponent } from ‘vue’ const Component: DefineComponent<{}, {}, any> export default Component // 必须要导出 } ```
