经过源码调试,大概梳理出了这个工具的原理: 通过 TypeScript 内置的 ts.parseJsonConfigFileContent API 扫描出项目内完整的 ts 文件路径。...通过 TypeScript 内置的一些 compile API 分析出文件之间的 exports 和 imports 关系。...到此思路也就有了,把所有文件中的 imports 信息取一个合集,然后从第一步的文件集合中找出未出现在 imports 里的文件即可。...,就会调用这个底层 API 找出所有的引用。...模块语法不一致 ,TypeScript 的 findAllReferences 并不识别 Dynamic Import 语法,需要额外处理 import() 形式导入的模块。
而 jscodeshift、gogocode 的 Chaining API 则是命令式(Imperative)的,我们需要先获取到 AST 节点,然后对这个节点使用其提供(封装)的 API,这就使得我们很可能遗漏掉一些边界情况而产生不符预期的结果...而 TypeScript 的 API 呢?...我们从 identifier 开始创建,组装参数、if 语句的条件与代码块、函数的返回语句,最后通过 createFunctionDeclaration 完成组装。...做了这么多铺垫,是时候迎来今天的主角了,@ts-morpher[11] 基于 ts-morph 之上又做了一层额外封装,如果说 TypeScript Compiler API 的复杂度是 10,那么 ts-morph...@ts-morpher 将增删改查方法拆分到了不同的 package 下,如 @ts-morpher/helper 中的方法均用于获取声明或声明 Identifier ,如你可以获取一个文件里所有的导入的
转而一想, pzavolinsky/ts-unused-exports 这个工具既然都能分析出 所有文件的 导入导出变量的依赖关系 ,那分析出未使用的文件应该也是小意思才对。...经过源码调试,大概梳理出了这个工具的原理: 通过 TypeScript 内置的 ts.parseJsonConfigFileContent API 扫描出项目内完整的 ts 文件路径。...通过 TypeScript 内置的一些 compile API 分析出文件之间的 exports 和 imports 关系。...到此思路也就有了,把所有文件中的 imports 信息取一个合集,然后从第一步的文件集合中找出未出现在 imports 里的文件即可。...API 找出所有的引用。
其次,绝对的约束也使得所有人都只能接受这一规范,对于能力存在不足的成员来说,这在初期可能是很痛苦的过程,但实际上这是个不破不立的槛,当你习惯了通过这种严谨的方式,或者说束手束脚的方式编写代码之后,你就很难再回到自由不羁的...所以 TS 提供了 isolateModule 这个配置项,它会在你使用了除 TypeScript 以外的构建工具无法编译的语法时给出警告,常见的这一类语法有重新导出从别处导入的类型,因为对于类型的导入实际上是走的和值导入不同的空间...所以你可能会想,能不能把这些 API 封装起来,至少屏蔽一部分编译原理的知识?事实上社区也的确有这样的方案,即 ts-morph。...本着社区没有就自己造一个的原则,我在 ts-morph 的基础上封装了一批 AST 的 util 方法,AST 操作也本该如此,获取一个树节点,看看它是否是我们想要的结构,如果不是,我们修改这个声明,保存...接着,由于我们存在特殊的稳定性需求,比如希望新增的模块项目也需要被纳入到统一管控,所以我们基于 TypeScript 的 Compiler API 做了源码级的约束。
它也有一个复杂的解析算法,会从node_modules加载像react这样的普通模块名,并在无额外扩展名导入时尝试添加.js或.json。...外部模块可以通过URL直接从公开代码库导入,比如deno.land/x或GitHub 标准库: Node.js有一些内置的标准模块如fs、crypto、http。这些包名由Node.js保留。...://deno.land/std@0.114.0/node/crypto.ts"; 为了简化问题,将所有Node.js api导入移到一个名为adapter.node.ts的文件中,并只重新导出我们需要的功能...中浏览器兼容的部分代码) 获取所有文件列表 第一步先获取出源文件。...Deno的兼容模块提供了一个直接从CommonJS模块导入的方式。
TypeScript 从2012年开始,已经支持了大部分的格式,但随着时间的推移,社区和JavaScript规范已经融合到一种称为ES模块(或ES6模块)的格式上。...非模块 在开始之前,了解TypeScript认为模块是什么很重要。JavaScript规范声明,任何没有导出或顶级等待的JavaScript文件都应该被视为脚本,而不是模块。...然而,Math.ts中的所有代码都经过了评估,这可能会引发影响其他对象的副作用。...TypeScript的模块解析选项 模块解析是从import或require语句中获取字符串,并确定该字符串引用的文件的过程。 TypeScript包括两种解析策略:Classic和Node。...模块之间的所有通信都通过模块加载器进行,编译器标志模块确定使用哪个模块。在运行时,模块加载器负责在执行模块之前定位和执行模块的所有依赖项。
混合导入, 混合导出 在这里,我们采用在 types.ts 文件中定义的类型,然后从中重新导出它们。 打开 isolatedModules 时,此代码不会 通过类型检查。.../api"; 报错: image.png 一些理解: Babel 从我们的types模块中删除了所有内容,它仅包含类型。 Babel 没有对我们的 lib 模块进行任何转换。...从Node 的角度来看,Node 做模块解析时,会发现 types.js 中引入的文件是空的,报错:文件不存在。 如截图所示,tsc 类型检查过程立即将这些模糊的重新导出报告为错误。 2....显式类型导入,显式类型导出 这次,我们明确地将中的类型重新导出lib-import-export.ts。 打开 isolatedModules时,此代码将通过 tsc 类型检查。...现在,编译器(无论是tsc,babel还是其他)都将能够查看单个文件,并取消导入或导出(如果它是TypeScript类型)。
C 语言 hstone 函数的主体可能在某些未导出的函数中,或者只是包含在 _ main 中。导出的 WebAssembly 函数正是 JS glue 可以通过名称调用的函数。...,该模块将所有感兴趣的函数导出到 JS 编程器同样产生的 JS 粘合剂。...:获取并加载 WebAssembly 模块 hstone.wasm 然后实例化此模块,以便可以在浏览器控制台中调用导出的 hstone 函数进行确认。...第 1 行中的 fetch 调用使用 Fetch 模块从托管 HTML 页面的 Web 服务器获取 WebAssembly 模块。...WebAssembly 具有更简洁的 API,用于获取和实例化模块。新 API 将上面的脚本简化为 fetch 和 instantiate 操作。
--customConditions:获取当 TypeScript 从 package.json 的导出或导入字段解析时要考虑的附加条件列表。...5.0 引入了对 export type * 语法的支持,它允许您从另一个模块重新导出所有类型。.../types'; 在此示例中,使用 export type * 语法将 types.ts 模块中的所有类型重新导出到 index.ts 模块中。 9....在处理联合类型时,编辑器现在可以建议所有可能的情况,减少遗漏情况的机会,并使编写全面的 switch 语句变得更加容易。...API 重大更改:移至模块,删除了一些不必要的接口并进行了一些正确性改进。
例如,我们可以保证所有发布的类型都是模块化的,而非全局的。这样一来,工程师可以专注于代码编写,而无需操心如何让 TypeScript 与打包程序或测试框架完美搭配。...第一步是明确区分公共模块与私有模块。 Node 最近以 package.json “exports” 字段的形式获得了这种能力。它通过显式列出可从包外部访问的文件来定义封装边界。...这会通过显式注解导出来通知用户解决问题。或者在某些情况下,他们需要直接从公共包入口点导出内部类型来更新依赖项,以公开内部类型。 生态系统一致性,OK!...这种行为对于 TypeScript 的新手来说可能很难想象,他们希望类型是公共 API 的表示,就像在“Definitely Typed”上找到的手写类型一样。...这就是死类型消除(DTE),或更确切地说是摇树。我们编写了一个工具来执行这一操作——它只从声明文件中消除代码,这样任务最轻松。它不会重写或重定位代码——毕竟它不是打包器。
在运行脚本时,用户必须显式地授予这些权限,以确保更高的安全性。 支持 TypeScript:Deno 内置对 TypeScript 的原生支持,无需额外的配置或插件。...此外,Deno 支持在代码中直接引用 URL 进行远程模块的导入,这是 Node.js 所不具备的特性。 导出模块 在 Deno 中,模块的导出方式也与 Node.js 有所不同。...在 Deno 中,默认情况下所有声明都是私有的,如果要将某些内容导出,需要使用 export 关键字进行显式导出。...语法类似,但具体的语法细节和使用方式可能会有所不同。 Deno 中的模块导入导出语法更加符合标准的 ES 模块规范,并且对远程模块的支持更为友好,这是与 Node.js 最主要的区别之一。...第三方模块导入 在 Deno 中,您可以使用 ES 模块语法导入第三方依赖。以下是一些常见的导入第三方依赖的方式: 从 URL 导入:您可以直接从公共 URL 导入依赖项。
(例如:同一个接口或模块的不同声明,或拥有相同名字的函数和模块)。...上下文的创建是通过检查所有从命令行上传入编译器的文件,按顺序,然后再加入这些文件直接引用的其它文件或通过import语句和/// 的带.ts或.d.ts扩展名的文件。 导入失败不会报error,因为可能已经声明了外部模块。...Type可能被命名(比如,类和接口),或匿名(比如,对象类型)。...因为琐碎内容不是语言正常语法的一部分(不包括ECMAScript API规范)并且可能在任意2个令牌中的任意位置出现,它们不会包含在语法树里。
用 NodeJS, Express, MongoDB 和 TypeScript 设计 API 启动 创建 Todo 类型 创建 Todo 模块 创建 API 控制器 获取、新增、更新和删除 Todo 创建...API 路由 创建服务器 用 React 和 TypeScript 创建客户端 启动 创建 Todo 类型 从 API 获取数据 创建组件 添加 Todo 表单 展示 Todo 获取和展示数据 资源...在前面创建的 Todo 模块的帮助下,我们现在可以从 MongoDB 获取数据并返回 Todo 数组。...我们现在已经通过 Node、Express、TypeScript 和 MongoDB 完成 api 的构建。现在我们开始用 React 和 TypeScript 构建客户端。...然后,我们用相同的的接口定义 TodoProps ,组件会接受它并渲染数据。 现在我们已经定义了类型——现在让我们开始从 API 获取数据。
npx是个很棒的工具,它将在node_modules 文件夹中查找你提供的命令,因此,通过在命令前面加上前缀,可以确保我们使用的是本地版本,而不是你可能已安装的TypeScript的任何其他全局版本。...让我们从 target 开始,这定义了你将在浏览器中提供代码的JavaScript支持级别。如果您必须使用一组较旧的浏览器,这些浏览器可能不具有所有最新和最强大的功能,则可以将其设置为 ES2015。...让我们创建两个小模块,它们既导出函数,又为导出所有代码的模块提供一个主 entry 文件。...API方法并再次导出它们: import { add } from '..../subtract.js' export { add, subtract } 这意味着,用户可以通过导入只需要的东西来获取我们的功能,也可以通过获取所有的东西来获取。
TypeScript 是如何与 React,Vue,Webpack 集成的? TypeScript 练习题 ❝目录将来可能会有所调整。...❞ 注意,我的系列文章基本不会讲 API,因此需要你有一定的 TypeScript 使用基础,推荐两个学习资料。...深入理解 TypeScript 官方文档 结合这两个资料和我的系列教程,掌握 TypeScript 指日可待。 接下来,我们通过几个方面来从宏观的角度来看一下 TypeScript。...当然你可以导入 @types 下导出的定义,使得它们的作用域变成你的模块内部。.../typings"] } } types: TypeScript 编译器会默认引入typeRoot下所有的声明文件,但是有时候我们并**不希望全局引入所有定义**,而是仅引入部分模块。
对于你来说,可能还有其他选择,所以你应该从 Deno 网站获取的这个方法列表中为你的计算机使用适当的命令。...为了学习有关 Deno 和权限中的数据获取的知识,我们将用这个 API 来获取数据。...我们必须允许自己能够访问 Deno 领域以外的所有内容,可能是网络访问或文件访问,否则 Deno 将会拒绝工作。 Deno 的兼容性 前面你已经看到了怎样在 Deno 中使用 fetch。...在 Deno 中,所有库导入(无论是从标准库还是从第三方库)均使用指向专用文件的绝对路径来完成。你从这个 以服务器文件形式存在的 http 库[5] 导出一个名为served的函数。...如果你再次从浏览器的最后一部分中检查结果,可能会注意到 createdAt 的格式对人类很不友好,我们将用 date-fns[8] 库来使其可读: Deno 中的库通过绝对路径直接从 Web 导入。
TypeScript 3.8 将会带来了许多特性,其中包含一些新的或即将到来的 ECMAScript 特性、仅仅导入/导出声明语法等。...如果 Mything 仅仅是一个类型,Babel 和 TypeScript 使用的 transpileModule API 编译出的代码将无法正确工作,并且 TypeScript 的 isolatedModules...在一些基础的实践中,你可能需要写下 export {} 做为样板,来确保这种行为。 top-level await 并不会在你可能期望的所有环境下工作。...除此之外,我们几乎不可能确定哪个 API 会更好的工作,因为它们不仅依赖于平台,还取决于文件所在的文件系统。...这一直是个难题,因为 TypeScript 需要在更多平台上运行,而不仅仅是 Node.js。并且需要考虑到避免依赖模块完全独立。这尤其适用于对 Node.js 原生模块有依赖的模块。
比如,像JQuery这样的类库可能有一个默认导出 jQuery或$,并且我们基本上也会使用同样的名字jQuery或$导出JQuery JQuery.d.ts declare let $: JQuery;...库 要想描述非TypeScript编写的类库的类型,我们需要声明类库所暴露出的API 我们叫它声明因为它不是“外部程序”的具体实现。...它们以 UMD模块为代表。 这些库可以通过导入的形式或全局变量的形式访问。...复制代码 它同样可以通过全局变量的形式使用,但只能在某个脚本(指不带有模块导入或导出的脚本文件)里 mathLib.isPrime(2); 复制代码 创建模块结构指导 尽可能地在顶层导出 用户应该更容易地使用你模块导出的内容...例如,在C#里,你会从 System.Collections里找到所有集合的类型。 通过将类型有层次地组织在命名空间里,可以方便用户找到与使用那些类型。
Babel 模块:从 ES 模块转换 Babel with SystemJS TypeScript 模块:转换为 CJS、AMD、ES、系统模块 内部模块和命名空间 结论 希望本文可以帮助你了解和使用...IIFE 中,返回一个对象,这个对象是导出的 API 的占位符。...之后模块名可用于调用导出的模块 API。这称为 JavaScript 的模块模式。 混合导入 定义模块时,可能需要一些依赖关系。使用 IIFE 模块模式,其他所有模块都是全局变量。...默认情况下,每个 .js 文件都是 CommonJS 模块。为模块提供了暴露 API 的模块变量和导出变量。并且提供了一个 require 函数来使用模块。...ES 模块:ECMAScript 2015 或 ES6 模块 在所有模块混乱之后,JavaScript 的规范第 6 版在 2015 年定义了完全不同的模块系统和语法。
myVariable 的变量和一个名为 myFunction 的函数,并通过 export 关键字将它们导出,使其在导入该模块时可见。...通过声明文件扩展类型定义 在某些情况下,我们可能需要为已有的类型添加额外的属性或方法。...比如,我们可能在使用一个库时发现它缺少一些我们需要的类型定义,或者我们可能想要为一些内置类型(如 string 或 Array)添加一些自定义的方法。...因此,我们应该谨慎使用这种特性,尽可能地遵循库或语言的原始设计。 最后,当我们在一个项目中使用多个声明文件时,需要注意文件的加载顺序和作用域问题。...然后,我们通过 export 关键字将 request、get 和 post 等函数导出为模块的公共 API,以便在其他文件中使用这些函数。
领取专属 10元无门槛券
手把手带您无忧上云