【问题标题】:After conversion from typescript to javascript从 typescript 转换为 javascript 后
【发布时间】:2022-11-03 20:17:11
【问题描述】:

我试图消除对 TypeScript 的疑虑,但无法很好地澄清它,据我所知,TypeScript 是 JavaScript 的严格语法超集,它使我们的代码更好、更干净、更有意义,因为我们可以使用不同的类型来定义我们的对象、变量和类。

但是,如果我们使用从 TypeScript 代码转换而来的 JavaScript 代码来执行某个任务会发生什么?据我了解,它不再保证类型限制。

这里有几个我理解的指针(也许我错了或理解不正确):

  • TypeScript 只允许我们更好地编码。
  • 转换后不给予保证。
  • 它为我们提供了一个.d.ts 声明文件,我们可以在任何其他 TypeScript 项目中使用它。 (在 JS 中没用?)

请看下面的例子:

打字稿代码:

// Takes number only
const log = (a: number) => {
    console.log(a);
}

// NOTE: Passing string in ts showing/highlighting the issue, 
// however after conversion from TS to JS, 
// we can pass a string to the log method.
log('a');

转换为 JavaScript 代码如下:

"use strict";
// Takes number only
const log = (a) => {
    console.log(a);
};
// NOTE: Passing string in ts showing/highlighting the issue, 
// however after conversion from TS to JS, 
// we can pass a string to the log method.
log('a');

如果有人知道,您能否解释一下这是否有效?

如果是的话,我正计划开发一些小型库,这将帮助我们断言对象、类或变量,而不管 TypeScript 或 JavaScript,当我想研究这个时,我意识到我们已经有了 TypeScript。

请原谅我的错别字。

谢谢。

编辑:

将库托管在npmjs.com 站点,如果有人正在寻找类似的解决方案,他们可以使用它,我会慢慢改进它。谢谢

【问题讨论】:

    标签: javascript typescript tsc


    【解决方案1】:

    基本上,你的理解已经很对了。要回答您的一些问题:

    TypeScript 不对您的代码运行做出任何保证。如果 TypeScript 本身无法确定类型,则可以使用“any”强制转换或具有非严格类型的库或一些将回退到“any”类型的本机方法。

    TypeScript 最重要的是一个编译器。它可以编译您的代码,该代码可能已经使用旧版本的 Javascript 中不存在的功能与旧版本的 Javascript 兼容。此外——这是最突出的特性——它支持某种内置类型语法,可以在编译代码时检查并彻底删除。

    在构建库时,您可以也应该使用声明文件 (*.d.ts)。这些是具有特殊语法的文件,仅由 TypeScript 用于忽略某些其他文件或添加全局类型定义。例如。有一个文件“foo.js”并靠近它“foo.d.ts”,TypeScript 将改为读取“foo.d.ts”。这就是包的发布方式,因此在使用您的库时支持不同的构建工具以及不使用 TypeScript 的项目。

    【讨论】:

    • 感谢@viktor-luft 的回答,因此无论 JS 或 TS 代码如何,创建断言器都可以很好地限制运行时的内容。
    【解决方案2】:

    TypeScript 的好处在于,当那些使用从 TypeScript 创建的代码(无论是否编译)的人也使用类型感知系统时。例如:

    • 您在 TypeScript 中分发一个库。其他人也使用他们自己的 TypeScript 代码使用该库,如果他们尝试做一些不安全的事情(例如 log('a');),将会看到警告
    • 您在 TypeScript 中创建了一个库并在 JavaScript 中分发它以及一个 .d.ts 文件,该文件记录了其导出的类型。其他人使用自己的 TypeScript 使用该库,并且具有相同的好处。
    • 您创建了一个类似于上述任何一个的库,而其他人则这样做不是使用 TypeScript 来使用它 - 但他们使用的 IDE 支持类型感知并设置了设置以理解 TypeScript 类型(例如 VSCode)。虽然他们没有完整的 TypeScript 编译器,但他们至少能够看到不同值的类型,并且如果他们尝试做一些明显错误的事情,例如 log('a'),可能会在他们的 IDE 中收到警告。
    • 与上述相同,但该库的使用者仅使用 JavaScript 编写,而不使用类型感知 IDE - 例如,假设他们正在使用记事本编写。他们不会从您用 TypeScript 编写库中获得任何好处,因为他们不会看到任何警告,并且能够不安全地执行log('a');

    【讨论】:

      【解决方案3】:

      没错,Typescript 不提供任何运行时类型安全性,因为它永远不会运行;所有 TS 代码在运行前总是转换为 JS。不过,这并没有真正从它的价值中减去!

      每当您使用 Typescript 编写程序时,您的代码所涵盖的每个案例都会被正确输入。这意味着每当您尝试执行上述操作(将字符串放入数字函数中)时,它都会向您显示错误,并且希望不会转译。因此,只要您始终注意编辑器中的警告和错误,您的代码将(实际上)具有运行时类型安全性。

      不过也有一些例外。每当我们从外部源(例如 npm-packages 或 API 调用)接收对象时,我们不能总是确定这些对象具有我们期望的形状。可能 API 发生了变化,或者 npm-package 没有类型。在这些情况下,可能很想在任何地方使用any-type。

      不要使用any。那时你还不如写 JS。

      如果您的数据格式未知,请使用 unknown 类型,然后检查数据,直到您可以将其强制转换为类型或引发错误。

      tl;dr:TS 仅提供编译时类型安全,但这仍然非常好!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-24
        • 2016-11-18
        • 2023-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-04
        • 2013-04-18
        相关资源
        最近更新 更多