首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

经过一个月的探索,我如何将 AST 操作得跟呼吸一样自然

而 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 ,如你可以获取一个文件里所有的导入的

1.6K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    淘宝店铺 TypeScript 研发规约落地实践|技术详解

    其次,绝对的约束也使得所有人都只能接受这一规范,对于能力存在不足的成员来说,这在初期可能是很痛苦的过程,但实际上这是个不破不立的槛,当你习惯了通过这种严谨的方式,或者说束手束脚的方式编写代码之后,你就很难再回到自由不羁的...所以 TS 提供了 isolateModule 这个配置项,它会在你使用了除 TypeScript 以外的构建工具无法编译的语法时给出警告,常见的这一类语法有重新导出从别处导入的类型,因为对于类型的导入实际上是走的和值导入不同的空间...所以你可能会想,能不能把这些 API 封装起来,至少屏蔽一部分编译原理的知识?事实上社区也的确有这样的方案,即 ts-morph。...本着社区没有就自己造一个的原则,我在 ts-morph 的基础上封装了一批 AST 的 util 方法,AST 操作也本该如此,获取一个树节点,看看它是否是我们想要的结构,如果不是,我们修改这个声明,保存...接着,由于我们存在特殊的稳定性需求,比如希望新增的模块项目也需要被纳入到统一管控,所以我们基于 TypeScript 的 Compiler API 做了源码级的约束。

    1.1K20

    TypeScript系列教程十《模块》

    TypeScript 从2012年开始,已经支持了大部分的格式,但随着时间的推移,社区和JavaScript规范已经融合到一种称为ES模块(或ES6模块)的格式上。...非模块 在开始之前,了解TypeScript认为模块是什么很重要。JavaScript规范声明,任何没有导出或顶级等待的JavaScript文件都应该被视为脚本,而不是模块。...然而,Math.ts中的所有代码都经过了评估,这可能会引发影响其他对象的副作用。...TypeScript的模块解析选项 模块解析是从import或require语句中获取字符串,并确定该字符串引用的文件的过程。 TypeScript包括两种解析策略:Classic和Node。...模块之间的所有通信都通过模块加载器进行,编译器标志模块确定使用哪个模块。在运行时,模块加载器负责在执行模块之前定位和执行模块的所有依赖项。

    1.5K10

    你不知道的 「 import type 」

    混合导入, 混合导出 在这里,我们采用在 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类型)。

    4.3K61

    将超过5000万行JS代码迁移到TypeScript,我们得到的10大见解

    例如,我们可以保证所有发布的类型都是模块化的,而非全局的。这样一来,工程师可以专注于代码编写,而无需操心如何让 TypeScript 与打包程序或测试框架完美搭配。...第一步是明确区分公共模块与私有模块。 Node 最近以 package.json “exports” 字段的形式获得了这种能力。它通过显式列出可从包外部访问的文件来定义封装边界。...这会通过显式注解导出来通知用户解决问题。或者在某些情况下,他们需要直接从公共包入口点导出内部类型来更新依赖项,以公开内部类型。 生态系统一致性,OK!...这种行为对于 TypeScript 的新手来说可能很难想象,他们希望类型是公共 API 的表示,就像在“Definitely Typed”上找到的手写类型一样。...这就是死类型消除(DTE),或更确切地说是摇树。我们编写了一个工具来执行这一操作——它只从声明文件中消除代码,这样任务最轻松。它不会重写或重定位代码——毕竟它不是打包器。

    1.7K30

    deno入门教程

    在运行脚本时,用户必须显式地授予这些权限,以确保更高的安全性。 支持 TypeScript:Deno 内置对 TypeScript 的原生支持,无需额外的配置或插件。...此外,Deno 支持在代码中直接引用 URL 进行远程模块的导入,这是 Node.js 所不具备的特性。 导出模块 在 Deno 中,模块的导出方式也与 Node.js 有所不同。...在 Deno 中,默认情况下所有声明都是私有的,如果要将某些内容导出,需要使用 export 关键字进行显式导出。...语法类似,但具体的语法细节和使用方式可能会有所不同。 Deno 中的模块导入导出语法更加符合标准的 ES 模块规范,并且对远程模块的支持更为友好,这是与 Node.js 最主要的区别之一。...第三方模块导入 在 Deno 中,您可以使用 ES 模块语法导入第三方依赖。以下是一些常见的导入第三方依赖的方式: 从 URL 导入:您可以直接从公共 URL 导入依赖项。

    40820

    React、TypeScript、NodeJS 和 MongoDB 搭建 Todo App

    用 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 获取数据。

    17K30

    使用Typescript和ES模块发布Node模块

    npx是个很棒的工具,它将在node_modules 文件夹中查找你提供的命令,因此,通过在命令前面加上前缀,可以确保我们使用的是本地版本,而不是你可能已安装的TypeScript的任何其他全局版本。...让我们从 target 开始,这定义了你将在浏览器中提供代码的JavaScript支持级别。如果您必须使用一组较旧的浏览器,这些浏览器可能不具有所有最新和最强大的功能,则可以将其设置为 ES2015。...让我们创建两个小模块,它们既导出函数,又为导出所有代码的模块提供一个主 entry 文件。...API方法并再次导出它们: import { add } from '..../subtract.js' export { add, subtract } 这意味着,用户可以通过导入只需要的东西来获取我们的功能,也可以通过获取所有的东西来获取。

    2.7K20

    最全面的 Deno 入门教程

    对于你来说,可能还有其他选择,所以你应该从 Deno 网站获取的这个方法列表中为你的计算机使用适当的命令。...为了学习有关 Deno 和权限中的数据获取的知识,我们将用这个 API 来获取数据。...我们必须允许自己能够访问 Deno 领域以外的所有内容,可能是网络访问或文件访问,否则 Deno 将会拒绝工作。 Deno 的兼容性 前面你已经看到了怎样在 Deno 中使用 fetch。...在 Deno 中,所有库导入(无论是从标准库还是从第三方库)均使用指向专用文件的绝对路径来完成。你从这个 以服务器文件形式存在的 http 库[5] 导出一个名为served的函数。...如果你再次从浏览器的最后一部分中检查结果,可能会注意到 createdAt 的格式对人类很不友好,我们将用 date-fns[8] 库来使其可读: Deno 中的库通过绝对路径直接从 Web 导入。

    3.5K10

    TypeScript 3.8 Beta

    TypeScript 3.8 将会带来了许多特性,其中包含一些新的或即将到来的 ECMAScript 特性、仅仅导入/导出声明语法等。...如果 Mything 仅仅是一个类型,Babel 和 TypeScript 使用的 transpileModule API 编译出的代码将无法正确工作,并且 TypeScript 的 isolatedModules...在一些基础的实践中,你可能需要写下 export {} 做为样板,来确保这种行为。 top-level await 并不会在你可能期望的所有环境下工作。...除此之外,我们几乎不可能确定哪个 API 会更好的工作,因为它们不仅依赖于平台,还取决于文件所在的文件系统。...这一直是个难题,因为 TypeScript 需要在更多平台上运行,而不仅仅是 Node.js。并且需要考虑到避免依赖模块完全独立。这尤其适用于对 Node.js 原生模块有依赖的模块。

    1.8K30

    快速学习TypeScript——模块

    比如,像JQuery这样的类库可能有一个默认导出 jQuery或$,并且我们基本上也会使用同样的名字jQuery或$导出JQuery JQuery.d.ts declare let $: JQuery;...库 要想描述非TypeScript编写的类库的类型,我们需要声明类库所暴露出的API 我们叫它声明因为它不是“外部程序”的具体实现。...它们以 UMD模块为代表。 这些库可以通过导入的形式或全局变量的形式访问。...复制代码 它同样可以通过全局变量的形式使用,但只能在某个脚本(指不带有模块导入或导出的脚本文件)里 mathLib.isPrime(2); 复制代码 创建模块结构指导 尽可能地在顶层导出 用户应该更容易地使用你模块导出的内容...例如,在C#里,你会从 System.Collections里找到所有集合的类型。 通过将类型有层次地组织在命名空间里,可以方便用户找到与使用那些类型。

    1.2K10

    与 JavaScript 模块相关的所有知识点

    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 年定义了完全不同的模块系统和语法。

    2.1K20

    《现代Typescript高级教程》扩展类型定义

    myVariable 的变量和一个名为 myFunction 的函数,并通过 export 关键字将它们导出,使其在导入该模块时可见。...通过声明文件扩展类型定义 在某些情况下,我们可能需要为已有的类型添加额外的属性或方法。...比如,我们可能在使用一个库时发现它缺少一些我们需要的类型定义,或者我们可能想要为一些内置类型(如 string 或 Array)添加一些自定义的方法。...因此,我们应该谨慎使用这种特性,尽可能地遵循库或语言的原始设计。 最后,当我们在一个项目中使用多个声明文件时,需要注意文件的加载顺序和作用域问题。...然后,我们通过 export 关键字将 request、get 和 post 等函数导出为模块的公共 API,以便在其他文件中使用这些函数。

    60810
    领券