我使用带有typescript的外部库有很多困难。我非常希望为没有可用类型的库添加自定义类型,并且我很难理解导入的方式并且需要使用打字。
有什么区别,以及相应的打字如何查找以下情况:
import something = require('something');
import * as something from 'something';
const something = require('something');
import {something} from 'something';
答案 0 :(得分:2)
require
是导入外部模块的“旧”方式,import
语法是当前推荐的与ES6语法一致的方式。根据{{1}}中配置的module
,TypeScript会将此语法转换为相关的模块类型/样式。
如果您想了解TypeScript如何解析外部模块(它支持两种模式tsconfig.json
和node
- 可在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/。从博客 - 它将:
moduleResolution
旁边的module.d.ts
获取自定义代码module.js
typings:
中的packages.json
节点模块(node_modules
)declare module X
出现时在其处理的文件包中查找任何环境声明(tsconfig.json
语法)。这很重要,因为该文件的存在使得TypeScript将所有包含的文件作为单个“项目”/“工作区”进行处理/// <reference path="path/to/declarations.d.ts" />
- 鉴于可以使用tsconfig.json
项目文件,我不再推荐这一点。您还有两种类型:
外部模块类型 - 在文件旁边,或者在节点模块的情况下,它们的路径存在于typings:
的{{1}}中。语法是project.json
,没有模块声明(文件是模块!)。考虑一下它们与代码文件的“绑定”,以及“这就是这个模块的样子”
环境打字 - 住在任何地方。语法是export X
。考虑一下“某处存在类型/模块X,这就是它的样子”。对于模块,TypeScript将根据模块名称进行匹配。其他用例是全局变量(例如jQuery的declare module X
)。
有关$
中可以配置的内容和方式的文档,请阅读: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();