现代浏览器中的 TypeScript 支持

Posted

技术标签:

【中文标题】现代浏览器中的 TypeScript 支持【英文标题】:TypeScript support in modern browsers 【发布时间】:2014-05-18 03:12:58 【问题描述】:

我刚刚阅读了一些与 TypeScript 相关的广告信息,除此之外,我对这个 javascript 超集没有任何经验。所以我有一些基本问题:

    现代浏览器对原生 TypeScript 的支持情况如何?

    各大浏览器厂商对于未来原生支持TypeScript的立场是什么?

    TypeScript 和 ECMAScript6 有什么关系,TypeScript 提供的功能比 ECMAScript6 多吗?

请随意回答所有问题或部分问题。

【问题讨论】:

也许这个问题可以使用一些简化,尽管核心问题仍然很清楚,一个简单的谷歌搜索不会(现在)返回一个包含支持哪些版本的浏览器列表的页面Typescript 原生 这个问题被关闭的原因根本没有意义。这是一个非常有效的问题,可以帮助任何尝试学习打字稿的人。对于初学者来说,它总是令人困惑,并且通常错误地认为 TypeScript 是在浏览器中评估和运行的,因为它被称为 javascript 的超级脚本。嗯,这是在不同的意义上,所以这些问题中的一些有助于阐明那些构建块的细节 这是一个很好的问题,看起来人们还没有答案。我会设想一个未来,所有主流浏览器都在网页和控制台中即时将最新的 rfc 标准 TypeScript 直接编译为 Web 程序集字节码。在那之前,我个人真的希望避免在 TypeScript 工具上花费任何时间和眼泪。 【参考方案1】:

原生支持

可以很容易地添加本机支持,例如https://github.com/basarat/typescript-script 添加了对脚本标签的支持(尽管这会为页面增加 6MB 的支持 JS)。但是,将 TypeScript 编译为 JavaScript 会降低性能,为了获得最佳性能,最好在浏览器中预编译和执行编译后的 JavaScript。

浏览器供应商没有计划添加原生 TypeScript 支持。浏览器中唯一通用的原生语言是 JavaScript 和 WebAssembly。 TypeScript 可以被转译为任何一种并在浏览器中运行,因此它不是一个拦截器。

非原生支持

现代浏览器对 TypeScript 的支持情况如何?

Typescript 编译为 JS,因此它被所有浏览器(甚至 IE6)支持

各大浏览器厂商对于TypeScript未来支持的立场是什么?

无需代表浏览器供应商进行任何工作。

TypeScript 和 ECMAScript6 有什么关系,TypeScript 提供的功能比 ECMAScript6 多吗?

是的,例如来自未来的 javascript 版本,例如类中的类字段和静态属性。

【讨论】:

这显然是 Artem 的意思。浏览器支持TypeScript意味着你可以在浏览器加载的页面中直接使用TypeScript。 相当。不知道堆栈书呆子关闭这个问题的目的是什么,OP 在问什么非常明显,而这个答案并没有提供答案。 问题是“现代浏览器对 NATIVE TypeScript 的支持情况如何” NATIVE 在我回答后被添加。并且由 不是 OP 的人添加:imgur.com/a/haFrB "TypeScript 不应该在本地运行" 为什么不呢? “Typescript 编译为 JS,因此所有浏览器都支持它”这没有回答问题。【参考方案2】:

尝试设计一个可以同时原生支持多种语言的网络浏览器正是 Google 尝试用 Dart 做的事情。为 Chrome 计划了一个 Dart 引擎,但这最终成为一项太大的任务,除了“只是不使用 java 脚本”之外几乎没有什么好处。

我怀疑原生支持 Typescript 将是一项同样艰巨的任务。改进 ECMAScript 并在有意义的地方添加一些 TS 想法可能会更好。不过我确实喜欢TS。

【讨论】:

我不认为它会同样令人生畏。似乎可以通过添加到现有的 JS 解析器来解析语言来实现 TS 支持,然后简单地去除 TS 特定的语法,并在 V8 上运行生成的代码,这是可能的,因为 TS 是 JS 的超集。 Dart 是一种完全不同的语言,需要自己的 AST 和 VM。 @brandon-duffany,不可能将 TypeScript 代码“剥离”为纯 JavaScript。您需要一个真正成熟的 TS 编译器来将所有 TS 功能(如泛型、联合类型、交集类型等)转换为等效的 JS 代码;不幸的是,它们不能被“剥离”。 TS确实是JS的超集,这意味着任何有效的JS都是TS,但这并不一定意味着TS可以通过删除类型注释和东西轻松转换回JS。 我并不是说它必须实现任何类型的运行时类型检查。毕竟,TS 也不会在运行时进行类型检查。例如,当浏览器看到type Foo = string | int 时,它可能会说“哦,这是一个类型声明。让我们忽略它。”。然后当它看到let foo: Foo = 1 时,它可以选择忽略: Foo 部分。完全有效的 JS。它与 Dart 非常不同,因为 Dart 实际上是在运行时进行类型检查的。【参考方案3】:

Typescript 无法在任何浏览器中运行或理解。因此,Typescript 被编译为 Javascript(浏览器可以理解)。 Typescript 可以使用所有 ES6 功能,并且在编译期间它们将被转换为 ES5 等目标编译选项。

【讨论】:

【参考方案4】:

目前它不起作用,但这是一个有趣的话题。很高兴知道 ECMAScript 是否会在某个时候支持接口、类型和其他东西。特别是,我注意到 ES 实际上从 TypeScript 中缓慢地获取了一些部分,例如枚举。

如果它可以工作,我宁愿将它视为 ECMAScript 从 TypeScript 中获取一些东西,而不是原生支持 TypeScript 本身。

【讨论】:

以上是关于现代浏览器中的 TypeScript 支持的主要内容,如果未能解决你的问题,请参考以下文章

初探TypeScript

vue-type-check: Vue 模板中的 Typescript 类型检查

搭建vue3+typescript+vite+yarn项目

现代编程语言:Rust (铁锈,一文掌握钢铁是怎样生锈的)

如何使用 TypeScript 2.3 中新增的支持来限制 TypeScript 中 React Children 的类型?

现代浏览器中的鼠标滚轮事件