zoukankan      html  css  js  c++  java
  • ts笔记-模块

    全局模块

    在全局命名空间中定义的模块就是全局模块,示例:

    // foo.ts
    const foo = 123;
    
    // bar.ts
    const bar = foo;
    

    以上这种方式编译是通过的,因为foo在全局命名空间中,所以其他任何文件都可以引用foo。显然这是危险行为。

    文件模块

    文件模块也被称为外部模块,当我们使用import/export导入导出模块时,他会在当前文件中创建一个本地作用域。

    // foo.ts
    const foo = 123;
    
    export {}
    
    // bar.ts
    const bar = foo; // ERROR: "cannot find name 'foo'"
    

    模块使用

    js模块系统有多种实现方式,常见的规范有commonjs, amd, es modules,AMD它仅能在浏览器工作,esmodule目前存在浏览器兼容问题,因此更推荐使用node推出的commonjs规范。

    在ts中设置module:commonjs,可以让我们像使用es modules一样使用commonjs。

    // 导出一个变量或类型
    const someVar = 123;
    type someType = {
      type: string;
    };
    
    export { someVar, someType };
    
    // 导入模块
    import 'core-js';
    
    // 导入一个变量或类型
    import { someVar, someType } from './foo';
    
    

    默认导出

    // some var
    export default (someVar = 123);
    
    // some function
    export default function someFunction() {}
    
    // some class
    export default class someClass {}
    

    模块路径

    import导入支持相对路径和绝对路径,相对路径比较简单不做过多解释,绝对路径的查找顺序是下面这样的:

    当你使用 import * as foo from 'foo',将会按如下顺序查找模块:

    • ./node_modules/foo
    • ../node_modules/foo
    • ../../node_modules/foo
    • 直到系统的根目录

    当你使用 import * as foo from 'something/foo',将会按照如下顺序查找内容

    • ./node_modules/something/foo
    • ../node_modules/something/foo
    • ../../node_modules/something/foo
      直到系统的根目录

    place

    place解释了模块查找的方式,具体如下:

    import foo from './foo'
    

    如果place是一个文件,并且存在foo.ts,命中

    如果place是一个文件夹,并且存在foo/index.ts,命中

    如果place是一个文件夹,并且存在foo/package.json,并且文件中指定的types文件存在,命中

    如果place是一个文件夹,并且存在package.json,并且文件中指定的main文件存在,命中

    重写类型的动态查找

    上面place介绍的查找方式,是可以人为修改的。我们可以定义一个global.d.ts文件,修改它的查找位置。

    // global.d.ts
    declare module 'foo' {
      // some variable declarations
      export var bar: number;
    }
    
    // foo 是 { bar: number }
    import * as foo from 'foo';
    

    global.d.ts 文件,用来将一些接口或者类型放入全局命名空间里,这些定义的接口和类型能在你的所有 TypeScript 代码里使用。对于一些新手和没有声明的第三方库可以使用global.d.ts避免报错。

    import/require

    import foo = require('foo');
    

    上面这行代码做了两件事:第一是导入foo 模块的所有类型信息,二是确定 foo 模块运行时的依赖关系。

    如果没有foo当作变量声明空间使用,那么编译成js时候上面的导入代码会被自动移除。

    // ts
    import foo = require('foo');
    
    // 编译为js,什么也没有
    
    // foo当作变量声明空间使用(foo是一个包含类型声明的commonjs 模块的库,导入)
    import foo = require('foo');
    var bar: foo;
    
    // 编译为js
    let bar;
    
    // foo当作变量使用,就会被当做包引入
    import foo = require('foo');
    const bar = foo;
    
    // 编译为js
    const foo = require('foo');
    const bar = foo;
    
    常用网站: SegmentFault | GitHub | 掘金社区
  • 相关阅读:
    adb pull / push
    June 25,2014---->Binder(IPC),Dalvik ,DEX/ODEX
    adb 读写模式 挂载文件系统
    INSTALL_FAILED_UID_CHANGED
    Logcat不显示Application的解决办法
    Android终端管理器删除文件夹
    ADB
    StringBuffer
    扑克牌排序
    windows内存管理方式以及优缺点
  • 原文地址:https://www.cnblogs.com/yesyes/p/15394093.html
Copyright © 2011-2022 走看看