在打字稿中导入库的不同方法有何不同?

时间:2016-06-14 09:17:11

标签: typescript

我使用带有typescript的外部库有很多困难。我非常希望为没有可用类型的库添加自定义类型,并且我很难理解导入的方式并且需要使用打字。

有什么区别,以及相应的打字如何查找以下情况:

import something = require('something');

import * as something from 'something';

const something = require('something');

import {something} from 'something';

1 个答案:

答案 0 :(得分:2)

require是导入外部模块的“旧”方式,import语法是当前推荐的与ES6语法一致的方式。根据{{​​1}}中配置的module,TypeScript会将此语法转换为相关的模块类型/样式。

如果您想了解TypeScript如何解析外部模块(它支持两种模式tsconfig.jsonnode - 可在classic中配置为tsconfig.json),请阅读文档在这里:http://www.typescriptlang.org/docs/handbook/module-resolution.html。主要区别在于如何解析非相对模块路径。

如果您想了解TypeScript查找类型(类型声明)的方式和位置,请阅读此博文:http://ivanz.com/2016/06/07/how-does-typescript-discover-type-declarations-definitions-javascript/。从博客 - 它将:

  1. 尝试使用moduleResolution旁边的module.d.ts获取自定义代码
  2. 尝试检查module.js typings:中的packages.json节点模块(node_modules
  3. 尝试在declare module X出现时在其处理的文件包中查找任何环境声明(tsconfig.json语法)。这很重要,因为该文件的存在使得TypeScript将所有包含的文件作为单个“项目”/“工作区”进行处理
  4. 查找tripple-slash评论/// <reference path="path/to/declarations.d.ts" /> - 鉴于可以使用tsconfig.json项目文件,我不再推荐这一点。
  5. 您还有两种类型:

    1. 外部模块类型 - 在文件旁边,或者在节点模块的情况下,它们的路径存在于typings:的{​​{1}}中。语法是project.json,没有模块声明(文件是模块!)。考虑一下它们与代码文件的“绑定”,以及“这就是这个模块的样子”

    2. 环境打字 - 住在任何地方。语法是export X。考虑一下“某处存在类型/模块X,这就是它的样子”。对于模块,TypeScript将根据模块名称进行匹配。其他用例是全局变量(例如jQuery的declare module X)。

    3. 有关$中可以配置的内容和方式的文档,请阅读:https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

      关于您提供的不同示例 - 假设您有一个名为tsconfig.json的模块。需要注意的一件事是文件是JS / TS世界中的一个模块,所以:

      <强> moduleA.ts

      moduleA

      moduleA.js - 已编译(目标ES5和模块类型CommonJS)

      export class Car
      {
          public model: string = "";
      }
      

      <强> main.ts

      "use strict";
      var Car = (function () {
          function Car() {
              this.model = "";
          }
          return Car;
      }());
      exports.Car = Car;
      

      main.js - 已编译(目标ES5和模块类型CommonJS)

      import moduleA = require("./moduleA");
      
      new moduleA.Car();
      
      // equivalent to the above - import everything under myModuleName
      import * as myModuleName from './moduleA';
      
      new myModuleName.Car();
      
      // import only the Car class
      import {Car} from './moduleA'
      
      new Car();
      
      // import only the Car class and alias it as MyCar
      import {Car as MyCar} from './moduleA'
      
      new MyCar();