0

在 Deno 中,要导入 TypeScript 模块,您自己的代码文件是否必须是 TypeScript?还是 Deno 在导入模块之前自动将 TypeScript 转换为 javascript?

我希望我的所有代码文件都是 EcmaScript 模块(js 或 mjs,但不是 ts)。

与现在的其他人不同,我想避免在自己的代码中使用 TypeScript。我不喜欢静态类型的死板,Typescript 不是 EcmaScript 标准的一部分。仅 EcmaScript 就拥有我管理大型项目所需的一切。对我来说,TypeScript 是一种过时的技术,自 ES6 模块出现以来就不再需要它了。TypeScript 解决的问题类型是我没有的问题。

但是,很明显,Deno 中可用的许多 3rd 方模块将使用 TypeScript 编写。是否可以以在导入之前转换为 JavaScript 的方式导入这些模块,以便我可以将自己的代码保留为纯粹的 EcmaScript?

4

1 回答 1

3

您可以使用 JavaScript 编写自己的代码。

假设您拥有或正在使用 TypeScript 文件/模块numbers.ts

export function isEven(n: number): boolean {
    if (n % 2 != 0) {
        return false
    }
    return true;
}

app.js您可以使用JavaScript 脚本导入并运行它:

import { isEven } from "./module.ts";

const one = isEven(1)
const two = isEven(2)

console.log(one)
console.log(two)

Deno 在内部将 TypeScript 转换为 JavaScript。使用标准或第 3 方库时,该过程是相同的。Deno 项目的人们更进一步,将其添加为目标:

https://deno.land/manual/introduction

浏览器兼容:完全用 JavaScript 编写且不使用全局 Deno 命名空间(或对其进行功能测试)的 Deno 程序子集,也应该能够在现代 Web 浏览器中运行而无需更改。

名称解析必须是完全限定的。在这个使用 TypeScript 的专用页面中有更多关于引用类型定义的内容:

https://deno.land/manual/getting_started/typescript

Deno 在运行时支持 JavaScript 和 TypeScript 作为第一类语言。这意味着它需要完全限定的模块名称,包括扩展名(或提供正确媒体类型的服务器)

例子:

import { config } from "https://deno.land/x/dotenv/mod.ts";

按照上面的示例,您可以使用该bundle命令生成包含所有依赖项的单个 JavaScript 文件。捆绑它会占用我的app.jsmodule.ts文件并创建一个新文件app.bundle.js,它是 JavaScript。

https://deno.land/manual/tools/bundler

$ deno bundle app.js app.bundle.js
Bundling file:///home/pomatti/projects/deno-sandbox/app.js
Emitting bundle to "app.bundle.js"
3111 bytes emmited.
$ deno run app.bundle.js
false
true

它甚至可以在浏览器中加载:

捆绑包也可以在 Web 浏览器中加载。bundle 是一个自包含的 ES 模块,所以 type 的属性必须设置为“module”。例如:

<script type="module" src="website.bundle.js"></script>

在此处输入图像描述

至于 ECMAScript 模块,我想指出 TypeScript 也实现了它。

https://github.com/microsoft/TypeScript/issues/2242

https://www.staging-typescript.org/docs/handbook/modules.html

从 ECMAScript 2015 开始,JavaScript 有了模块的概念。TypeScript 共享这个概念。

现在,“静态类型”讨论超出了本论坛的范围,所以我不会在这里触及它,但我相信我涵盖了其他所有内容。

于 2020-05-19T05:11:21.170 回答