首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    经过一个月的探索,我如何将 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

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

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

    2.7K20

    deno入门教程

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

    41020

    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

    最全面的 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
    领券