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

探索类型系统的底层 - 自己实现一个 TypeScript(硬核干货)

它包含了一个完整的 JavaScript 超集,所有这些都需要解析器来理解。 2. 在 AST 上转换节点 操作 AST 节点 这里将执行应用于 AST 的任何转换。 3....生成源代码 将 AST 转换为 JavaScript 源代码字符串 类型系统必须将任何非 js 兼容的 AST 映射回原生 JavaScript。 类型系统如何处理这种情况呢?...我们将其限制在三个场景中的原因是,我们可以关注每一个场景中的具体机制,并希望到最后能够对如何引入更复杂的类型检查有一个更好的构思。 我们将在编译器中使用函数声明和表达式(调用该函数)。...在我们进一步讨论之前,对于每种类型,我们将使用的基本逻辑是: 函数声明:检查参数的类型是否有效,然后检查函数体中的每个语句。...如果找到类型注解,就检查给定参数的类型 argType 是否存在。如果不进行错误处理,场景 2 会在这里报错误。 之后处理函数体,但是我们知道没有函数体需要处理,所以我把它留空了。

1.2K40
您找到你想要的搜索结果了吗?
是的
没有找到

TypeScript如何工作的

TypeScript 是一门基于 JavaScript 拓展的语言,它是 JavaScript 的超集,并且给 JavaScript 添加了静态类型检查系统。...; 绑定器遍历 AST 语法树,生成一系列 Symbol,并将这些 Symbol 连接到对应的节点上; 检查器再次扫描 AST检查类型,并将错误收集起来; 发射器根据 AST 生成 JavaScript...的结构 AST 中的节点称为 Node,Node 中记录了这个节点的类型、在源码中的位置等信息。...一个源文件也是一个 Node —— SourceFile,它是 AST 的根节点。 关于如何从源码生成 AST,以及从 AST 生成最终代码,相关理论很多,本文也不再赘述。...对于赋值操作,检查给这个 Node 赋的值是否匹配这个 Node 的类型。对于导入操作,检查 Symbol 是否导出了这个变量。

5.4K30

JavaScript生态加速攻略:eslint

本文讨论了如何通过优化选择器引擎和AST转换过程,以及完善JavaScript中的linter,从而加速JavaScriptTypeScript项目。...从一堆对象(=AST节点)中,我们挑选出符合某种条件的对象。那就是选择器!那么,如果我们避免使用选择器解析逻辑,并改用纯 JavaScript 函数呢?...转换所有的AST节点 我们将从一开始的TypeScript转换开始。我们的工具将我们提供给它们的代码解析一种称为抽象语法树(简称:AST)的数据结构。你可以将其视为我们所有工具使用的基本构建块。...它期望每个 AST 节点都与 estree 规范匹配,该规范规定了每个 AST 节点应该如何查看。这是一个已经存在了相当长时间的规范,许多 JavaScript 工具都是从这个规范开始的。...但这就是在使用TypeScript时问题的关键所在。TypeScriptAST格式非常不同,因为它还需要考虑表示类型本身的节点

59420

CodeMod 代码重构升级必知必会

我们通常将它作为 JavaScriptAST 转换器和非破坏(nondestructive)代码格式化工具来使用。...⚠️ gogocode 不会去检查通配符分组是否相等,例如 _1 === _1 , 你可能期望匹配两侧相等的节点,例如 foo === foo , 但是 gogocode 会匹配到所有的全等表达式...首先会通过 recast 的 visit 函数,查找到所有的 ImportDeclaration 节点,然后依次递归匹配节点属性,例如: importKind 是否是 value?...specifiers:第一项是否 ImportDefaultSpecifier, ImportDefaultSpecifier 的 local 是否 Vue?...主要用于转译最新的(包括实验性的) JavaScript 语言特性,并且支持 Typescript、Flow、JSX 等非标准语法 @babel/parser 基于 visit 访问器模式。

61820

上帝视角看 TypeScript

TypeScript 编译器是如何工作的? 上面已经讨论了 TypeScript 编译器的输入和输出。那黑盒内部是怎么工作呢?这里我简单介绍一下: ?...TypeScript 文本首先会被解析 token 流。这个过程比较简单,就是单纯地按照分隔符去分割文本即可。 ? 接着 token 流会被转换为 AST,也就是抽象语法树。 ?...binder 则根据 AST 信息生成 Symbol(TypeScript 中的一个数据结构)。拿上面的图来说,就是 number 节点。...当我们需要类型检查的时候, checker 会根据前面生成的 AST 和 symbols 生成类型检查结果。...因此设计语言的出发点就是: 静态类型系统 可以编译成 JavaScript 因此 TypeScript 是一门最终编译为 JavaScript 的语言(当然还有类型文件)。

69831

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

,就是先解析成 AST,然后检查函数返回值的类型节点,也就是 TypeNode 是否存在。...前面说到对于编译原理知识的储备,也就意味你需要了解 SynatxKind、Statement 这些 AST节点,你需要了解它们在 AST 中的作用,在实际源码中都代表着什么,同时 TypeScript...本着社区没有就自己造一个的原则,我在 ts-morph 的基础上封装了一批 AST 的 util 方法,AST 操作也本该如此,获取一个树节点,看看它是否是我们想要的结构,如果不是,我们修改这个声明,保存...我们看上面的图中,检查一个导入是否存在,已存在的 Class 新增一个 Entity 装饰器。更进一步,还可以检查一个导入是不是要求的类型,比如命名空间导入,仅类型导入,混合导入等等。...我们本身并没有统一的 AST Checker 方法,每个项目要求的 AST 检查都不一样,所以它是与项目实际关联的,我们把这一卡口放在最前,即先通过了 AST 检查才会有后面工程侧引入的 Lint、TypeScript

1.1K20

前端代码质量—怎样实现一个支持多语言、高扩展性的 Linter

但是规定了是什么样和能确保规范被执行了是两回事,需要有人检查代码是否执行了规范,并在合适的时候告诉程序员哪里有问题,需要改。 因此程序员们开发了一系列工具来监督广大的程序员。...转换为抽象语法树 AST Lint 工具会先将文件解析抽象语法树,否则无法分析代码是否存在问题,甚至不知道这段文本是不是合法的代码。...通过 AST 分析可能存在的问题 通过 AST 可以寻找可能存在问题的节点,而这些可能存在问题的节点和对应的问题,就成了这段代码针对该规则的诊断信息。...规则就是一个函数,输入 AST,输出诊断。 用图的方式表达更加清晰 AST 配置 配置是什么 配置是对规则的约束。同一条规则的实现,可能出现两种相反或者多种不一致的情况。...包括: 收集要检查的代码(文件或者字符串) 收集配置 根据配置收集和准备规则 准备解析器 将代码解析 ASTAST 传递给规则 规则返回诊断 显示诊断 必要时进行自动修复 引擎会不断重复这些过程

1.4K20

前端代码质量—怎样实现一个支持多语言、高扩展性的 Linter

但是规定了是什么样和能确保规范被执行了是两回事,需要有人检查代码是否执行了规范,并在合适的时候告诉程序员哪里有问题,需要改。 因此程序员们开发了一系列工具来监督广大的程序员。...转换为抽象语法树 AST Lint 工具会先将文件解析抽象语法树,否则无法分析代码是否存在问题,甚至不知道这段文本是不是合法的代码。...通过 AST 分析可能存在的问题 通过 AST 可以寻找可能存在问题的节点,而这些可能存在问题的节点和对应的问题,就成了这段代码针对该规则的诊断信息。...规则就是一个函数,输入 AST,输出诊断。 用图的方式表达更加清晰 AST 配置 配置是什么 配置是对规则的约束。同一条规则的实现,可能出现两种相反或者多种不一致的情况。...包括: 收集要检查的代码(文件或者字符串) 收集配置 根据配置收集和准备规则 准备解析器 将代码解析 ASTAST 传递给规则 规则返回诊断 显示诊断 必要时进行自动修复 引擎会不断重复这些过程

1.2K10

TypeScript 之父简介:TS Anders Hejlsberg: Introducing TypeScript参考资料TypeScript入门指南(JavaScript的超集)

image.png TypeScriptJavaScript 的超集,TypeScript结合了类型检查和静态分析,显式接口。...非常易学和易于理解 语言特性 类 接口 模块 类型注解 编译时类型检查 Arrow 函数 (类似 C# 的 Lambda 表达式) JavaScriptTypeScript 的区别 TypeScript...是 JavaScript 的超集,扩展了 JavaScript 的语法,因此现有的 JavaScript 代码无需做任何修改便可与TypeScript一起使用,TypeScript 通过类型注解提供编译时的静态类型检查...一个SourceFile对象表示一个给定文件的AST并且带有一些额外的信息如文件名及源文件内容。 然后,联合器(Binder)处理AST节点,结合并生成Symbols。...函数 描述 ts.Node.getStart 取得某节点的第一个令牌起始位置。 ts.Node.getFullStart 取得某节点拥有的第一个令牌的完整开始。

2.1K20

TypeScript的编译器过程和类型系统介绍

TypeScript编译器将TypeScript代码转换为可执行的JavaScript代码的过程如下: 解析:编译器首先会解析TypeScript代码,将其分解抽象语法树(Abstract Syntax...AST是一种树状结构,表示代码的语法结构。编译器会分析代码的语法、识别变量、函数、类等声明,并建立对应的符号表。 类型检查:在AST的基础上,编译器进行类型检查。...TypeScript是类型安全的语言,所以编译器会检查变量的类型是否与声明的类型一致,以及函数是否按照正确的参数类型进行调用等。如果发现类型错误,编译器会给出相应的错误信息。...总结起来,TypeScript编译器通过解析TypeScript代码、进行类型检查,然后根据转换规则将代码转换为JavaScript代码,最终输出可执行的JavaScript文件。...TypeScript的类型系统 TypeScript是一种静态类型检查的编程语言,通过类型系统来检查代码的类型错误。它基于JavaScriptJavaScript代码添加了静态类型。

30051

AST in TypeScript 实践

回到 AST 的话题中,因为 TypeScript 在近几年才算热门,ASTTypeScript 的应用上的优秀实践也难得一见,相关的文档及教程也不算太完整,于是开始了 AST in TypeScript...babel/traverse 这个工具,进行对 AST 快速的节点遍历与筛选。...封装好了相应的节点构造器,只需传入对应的 Name 参数即可返回相应的 AST 节点。   同样,babel/types 也支持多种节点类型的构造,具体文档可参考Babel - types ....AST ,第二个参数 options,具体可参考 Babel - generator.   ...总结   上次了解到 AST 还是在分析 Vue.js 是如何编译 Template 的,但没有深入去细究(虽然这次也不算太深入),这次的实践过程大概了解了 Babel 对于代码处理的过程以及所使用到的一些库

5.5K430

【面试】1902- tree-shaking的原理是什么?

举个例子: // ast.js let a = 1; function add() {} 我这里创建了一个文件ast.js,可以把整个文件理解一个File节点,存放程序体,而里面就是我们javascript...的语法节点了,我们javascript语法节点的根节点是Program,而我们在里面定了了两个节点,第一个节点是let a = 1,解析ast是VariableDeclaration,也就是变量声明节点...,第二个节点是function add() {},解析ast是FunctionDeclaration,也就是函数声明节点。...我们把语法解析成ast树之后,自然就可以按照一定的语法规则去检查它的语法是否正确,一旦错误就可以抛出错误,提醒开发者去修正。比如我们使用的vscode就是利用AST 提供实时的语法检查和错误提示。...这个其实跟第二点有点像,不过第二点是侧重于语法检查,而这个是针对类型检查的,比如我们的Typescript会利用ast进行类型检查和推断。 代码重构。基于AST树,我们可以对代码进行自动重构。

11210

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

以 Vue、Svelte 还有刚诞生不久的 Astro 代表,主要做其他自定义文件到 JavaScript(或其他产物) 的编译转化,如 .vue .svelte .astro 这一类特殊的语法。...TypeScript 的 Compiler API 是绝大部分开放的,足够用于做一些 CodeMod、AST Checker 这一类的工具,如我们使用原生的 Compiler API ,来组装一个函数:...的 AST,如 interface、类型别名、装饰器等(你可以在 ts-ast-viewer[7] 实时的查看 TypeScript AST 结构)。...同样的,在只是对粒度较粗的 AST 节点(如整个 Class 结构)做操作时,ts-morph 也有着奇效。...我们知道,AST 操作通常可以很轻易的划分为多个单元(如果你之前不知道,恭喜你现在知道了),比如获取节点-检查节点-修改节点 1-修改节点 2-保存源文件,这其中的每一个部分都是可以独立拆分的,如果我们能像

1.5K11

React Native工程中TSLint静态检查工具的探索之路

总第329篇 2019年 第007篇 TSLintTypeScript提供了代码检查能力,对使用TypeScript的React Native工程,在规范性、安全性、可靠性、可维护性等方面起到重要作用...而在React Native的开发过程中,针对于JavaScript的ESLint,与TypeScript的TSLint,则成为了主要代码静态检查的工具。...typescriptOnly true/false 是否只适用于TypeScript。 hasFix true/false 是否带有修复方式。 requiresTypeInfo 是否需要类型信息。...第七步,规则代码编写 通过ts.forEachChild方法对于语法树所有的节点进行遍历,在遍历的方法里可以实现自己的逻辑,其中节点的类ts.Node: ?...其中kind当前节点的类型,当然Node是所有节点的基类,它的实现还包括Statement、Expression、Declaration等,回到开头这个"class-name"规则,我们的所有声明类主要是

2.7K20

如何将Node.js库转换到Deno

项目可参考笔者另一篇文章deno 初体验,实战记录一个node项目迁移到deno需要做什么 Deno是一个新的JavaScript运行时,无需编译即原生支持TypeScript。...我们使用用TypeScript编写edgedb-js,它已经使用了ESM语法。在编译过程中,tsc将我们的文件转换成普通的=CommonJS语法的JavaScript文件。...Deno原生fs模块提供了walk函数可以实现: import {walk} from "https://deno.land/std@0.114.0/fs/mod.ts"; const sourceDir...我们将使用TypeScript的Compiler API来将源文件解析抽象语法树并找到导入语句 为了实现这个功能我们需要用到typescript NPM包的compile API。...首先检查路径是否对应于实际文件;如果失败了会尝试添加.ts;如果再失败则尝试添加/index.ts;如果再失败则抛出一个错误。 注入Node.js全局变量 最后一步是处理Node.js全局变量。

2.4K30

如何制定企业级代码规范与检查

就从我的题目说起,本篇文章告诉你针对定制代码规范和检查这个小需求如何做出亮点?看完本文后回顾上面提到的 4 点,感觉下。...ESLint ESLint 的原理就是一款插件化的javascript代码静态检查工具,其核心是对代码解析得到的 AST (Abstract Syntax Tree 抽象语法树)进行模式匹配,定位不符合约定规范的代码...create 返回一个对象,其中定义了一些在 AST 遍历访问到对应节点需要执行的方法等等。...的过程中会以“从上至下”再“从下至上”的顺序经过节点两次,selector 默认会在下行的过程中执行对应的访问函数,如果需要再上行的过程中执行,则需要添加:exit。...VSCode 自动 fix 配置 因为终极目标是我们在使用eslint格式化并且检查我们自己编写的 javascripttypescript

1.9K20

三分钟了解 AST

它涉及到工程化诸多环节的应用,比如: 如何Typescript 转化为 Javascript (typescript) 如何将 SASS/LESS 转化为 CSS (sass/less) 如何将 ES6...+ 转化为 ES5 (babel) 如何Javascript 代码进行格式化 (eslint/prettier) 如何识别 React 项目中的 JSX (babel) GraphQL、MDX、Vue...{ type: { ... }, value: "3", start: 4, end: 5, loc: { ... } }, ... ] 词法分析后的 Token 流也有诸多应用,如: 代码检查...,如 eslint 判断是否以分号结尾,判断是否含有分号的 token 语法高亮,如 highlight/prism 使之代码高亮 模板语法,如 ejs 等模板也离不开 语法分析 (Syntactic...AST 进行练手,以下两个示例是不错的选择 解析简单的 HTML AST 解析 Marktodwn List AST 或可参考一个最简编译器的实现 the super tiny compiler

1K40
领券