tsconfig.json
如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录。 tsconfig.json文件中指定了用来编译这个项目的根文件和编译选项。
可以手动创建tsconfig.json文件,也也可以通过tsc —init创建。
可以通过 compilerOptions 来定制编译选项,这边就写一点常见(我常见)的:
1 | { |
模块
全局模块
两个ts文件在同一个目录下,这样声明a相当于在全局中声明

文件模块
使用export或者import,会在文件中创建一个本地作用域

正确的使用方式:

相对模块路径:
当使用import { b } from "./moduleB"的时候,在/root/src/moduleA.ts里
/root/src/moduleB.ts/root/src/moduleB.tsx/root/src/moduleB.d.ts/root/src/moduleB/package.json(如果指定了"types"属性)/root/src/moduleB/index.ts/root/src/moduleB/index.tsx/root/src/moduleB/index.d.ts
非相对模块路径:
当导入不是相对模块路径的时候,当你使用 import { b } from "moduleB",它是在/root/src/folder/A.ts文件里,会按照下面顺序查找
/root/src/node_modules/moduleB.ts/root/src/node_modules/moduleB.tsx/root/src/node_modules/moduleB.d.ts/root/src/node_modules/moduleB/package.json(如果指定了"types"属性)/root/src/node_modules/moduleB/index.ts/root/src/node_modules/moduleB/index.tsx/root/src/node_modules/moduleB/index.d.ts
/root/node_modules/moduleB.ts/root/node_modules/moduleB.tsx/root/node_modules/moduleB.d.ts/root/node_modules/moduleB/package.json(如果指定了"types"属性)/root/node_modules/moduleB/index.ts/root/node_modules/moduleB/index.tsx/root/node_modules/moduleB/index.d.ts
/node_modules/moduleB.ts/node_modules/moduleB.tsx/node_modules/moduleB.d.ts/node_modules/moduleB/package.json(如果指定了"types"属性)/node_modules/moduleB/index.ts/node_modules/moduleB/index.tsx/node_modules/moduleB/index.d.ts
在步骤(8)和(15)向上跳了两次目录
NodeJS如何解析模块:
在Node.js里导入是通过require函数调用进行的。 Node.js会根据 require的是相对路径还是非相对路径做出不同的行为。
相对路径:
假设有一个文件路径为 /root/src/moduleA.js,包含了一个导入var x = require("./moduleB"); Node.js以下面的顺序解析这个导入:
- 检查
/root/src/moduleB.js文件是否存在。 - 检查
/root/src/moduleB目录是否包含一个package.json文件,且package.json文件指定了一个"main"模块。 在我们的例子里,如果Node.js发现文件/root/src/moduleB/package.json包含了{ "main": "lib/mainModule.js" },那么Node.js会引用/root/src/moduleB/lib/mainModule.js。 - 检查
/root/src/moduleB目录是否包含一个index.js文件。 这个文件会被隐式地当作那个文件夹下的”main”模块。
非相对路径:
Node会在一个特殊的文件夹 node_modules里查找你的模块。node_modules可能与当前文件在同一级目录下,或者在上层目录里。 Node会向上级目录遍历,查找每个node_modules直到它找到要加载的模块。
还是用上面例子,但假设/root/src/moduleA.js里使用的是非相对路径导入var x = require("moduleB");。 Node则会以下面的顺序去解析 moduleB,直到有一个匹配上。
/root/src/node_modules/moduleB.js/root/src/node_modules/moduleB/package.json(如果指定了"main"属性)/root/src/node_modules/moduleB/index.js
/root/node_modules/moduleB.js/root/node_modules/moduleB/package.json(如果指定了"main"属性)/root/node_modules/moduleB/index.js
/node_modules/moduleB.js/node_modules/moduleB/package.json(如果指定了"main"属性)/node_modules/moduleB/index.js
注意Node.js在步骤(4)和(7)会向上跳一级目录。
TS调用Js
index.ts
1 | import { b } from './untils/untils'; |
untils.d.ts
1 | export declare const b:number |
untils.js
1 | export const b = 1; |
实际的项目里,建议把声明放在.d.ts文件内,当然放在ts文件里也可以