Deno 的好处之一是,在 Deno 中运行代码时,它将 TypeScript 视为一流的语言,就像 JavaScript 或 Web 装配一样。这意味着您可以运行或导入"类型脚本",而无需安装任何比 Deno CLI 更多的内容。
但等一下,德诺真的运行类型脚本?你可能会问自己嗯,这取决于你所说的跑步是什么意思。有人可能会争辩说,在浏览器中,您实际上也不运行JavaScript。浏览器中的 JavaScript 引擎将 JavaScript 转换为一系列操作代码,然后在沙盒中执行这些代码。因此,它将 JavaScript 翻译为接近装配的东西。甚至 Web 装配也会进行类似的翻译,因为 Web 装配是不可知论的架构,而它需要转换为它正在运行的特定平台架构所需的机器特定操作代码。因此,当我们说 TypeScript 是 Deno 的一流语言时,我们的意思是,我们尝试使编写和运行 TypeScript 的用户体验像 JavaScript 和 Web 装配一样简单明了。
在幕后,我们使用 Rust 和 JavaScript 中的多种技术组合来提供这种体验。
它是如何工作的?
在高级别上,Deno 将类型脚本(以及 TSX 和 JSX)转换为 JavaScript。它通过类型脚本编译器的组合来做到这一点,我们将其构建为 Deno,以及一个名为swc 的Rust 库。当代码已键入并进行转换时,它将存储在缓存中,为下一次运行做好准备,而无需将其从源再次转换为 JavaScript。
您可以通过运行查看此缓存位置:deno info
> deno info
DENO_DIR location: "/path/to/cache/deno"
Remote modules cache: "/path/to/cache/deno/deps"
TypeScript compiler cache: "/path/to/cache/deno/gen"
如果您查看该缓存,您将看到一个目录结构,该目录结构模仿该源目录结构以及单个和文件(也可能是文件)。该文件是已转换的源文件,而文件包含我们想要缓存有关该文件的元数据,该数据目前包含源模块的哈希,帮助我们管理缓存失效。您也可能看到一个文件,这是一个 TypeScript 编译器增量生成信息文件,我们缓存以帮助加快类型检查。.js``.meta``.map``.js``.meta``.buildinfo
类型检查
TypeScript 的主要优点之一是,您可以使代码更加安全,以便在语法上有效的 JavaScript 成为带有"不安全"警告的 TypeScript。
在德诺,我们以两种主要的方式处理类型脚本。我们可以键入"类型脚本"(默认值),或者您可以选择使用标志跳过该检查。例如,如果您有要运行的程序,通常您会做这样的事情:--no-check
deno run --allow-net my_server.ts
但是,如果你想跳过类型检查,你会做这样的事情:
deno run --allow-net --no-check my_server.ts
类型检查可能需要大量时间,特别是如果您正在编写代码库,而您正在进行大量更改。我们试图优化类型检查,但它仍然要付出代价。如果您只是想破解某些代码,或者如果您在IDE中工作,该IDE在编写代码时键入检查您的代码,则使用肯定会加快在 Deno 中运行 TypeScript 的过程。--no-check
确定文件类型
由于 Deno 支持 JavaScript、类型脚本、JSX、TSX 模块,德诺必须决定如何处理这些类型的文件。对于本地模块,Deno 完全基于扩展做出此决定。当本地文件中缺少扩展时,假设它是 JavaScript。
对于远程模块,媒体类型(哑剧类型)用于确定模块的类型,当模块模棱两可时,模块的路径用于帮助影响文件类型。
例如,文件和文件在 TypeScript 中有不同的语义,并且在 Deno 中需要以不同的方式处理它们。虽然我们期望将文件转换为 JavaScript,但文件不包含"可运行"代码,只是描述类型(通常为"普通"JavaScript)。因此,当我们获取一个远程模块时,A 和文件的介质类型看起来是一样的。因此,我们来看看路径,如果我们看到的东西,有一个路径结束,我们把它作为一个类型定义只文件,而不是"可运行"的类型脚本。.d.ts``.ts``.ts``.d.ts``.ts.``.d.ts``.d.ts
支持媒体类型
下表提供了 Deno 在识别远程模块文件类型时支持的媒体类型列表:
媒体类型 | 如何处理文件 |
---|---|
application/typescript |
TypeScript (具有路径扩展影响) |
text/typescript |
TypeScript (具有路径扩展影响) |
video/vnd.dlna.mpeg-tts |
TypeScript (具有路径扩展影响) |
video/mp2t |
TypeScript (具有路径扩展影响) |
application/x-typescript |
TypeScript (具有路径扩展影响) |
application/javascript |
JavaScript (具有路径扩展影响) |
text/javascript |
JavaScript (具有路径扩展影响) |
application/ecmascript |
JavaScript (具有路径扩展影响) |
text/ecmascript |
JavaScript (具有路径扩展影响) |
application/x-javascript |
JavaScript (具有路径扩展影响) |
application/node |
JavaScript (具有路径扩展影响) |
text/jsx |
JSX |
text/tsx |
TSX |
text/plain |
尝试确定该路径扩展名,否则为未知 |
application/octet-stream |
尝试确定该路径扩展名,否则为未知 |
默认情况下严格
Deno Type默认在严格模式下检查打字稿,Tyescript核心团队建议使用严格模式作为明智的默认模式。这种模式通常会启用可能从一开始就应该存在的TypeScript功能,但随着TypeScript的不断发展,可能会破坏现有代码的更改。
混合JavaScript 和 TypeScript
默认情况下,Deno不检查JavaScript中的类型。这是可以更改的,在Deno.中配置TypeScript]中进一步讨论了这一点。在复杂的场景中,Deno确实支持JavaScript导入TypeScript和TypeScript导入JavaScript。
不过,需要注意的是,在检查类型时,默认情况下Deno将“读取”所有JavaScript,以便能够评估它对类型可能产生的影响。类型检查器将尽其所能找出您导入到TypeScript中的JavaScript的类型,包括读取任何JSDoc注释。这方面的详细内容在Types and Type declarations(类型和类型)》部分进行了详细讨论。
诊断是终结性的
虽然默认情况下,在遇到诊断(类型检查)问题时,程序在运行时仍会发出JavaScript,但Deno目前将它们视为终端。它将在出现这些警告时暂停,不会缓存任何发出的文件,并退出进程。tsc
。
为了避免这种情况,您需要解决该问题,使用或杂注,或者使用一起绕过类型检查。//@ts-Ignore re``//@ts-expect-error``--no-check
Type 解决
Deno的核心设计原则之一是避免“神奇”的解析,这也适用于类型解析。如果你想使用有类型定义的JavaScript(例如一个文件),你必须明确地告诉Deno这一点。有关如何完成此操作的详细信息,请参阅Types and Type declarations(类型和类型)]部分。.d.ts