我试图澄清我对TypeScript的疑虑,但没能很好地澄清,据我所知,TypeScript是JavaScript的一个严格的语法超集,它使我们的代码变得更好、干净、有意义,因为我们可以使用不同的类型来定义我们的对象、变量和类。
然而,如果我们使用从TypeScript代码转换而来的JavaScript代码来执行某个任务,会发生什么?据我所知,它不再保证类型限制。
所以这里有几个我理解的指针(也许我错了,或者没有正确理解):
- TypeScript只允许我们更好地编码
- 转换后不提供担保
- 它为我们提供了一个
.d.ts
声明文件,我们可以在任何其他TypeScript项目中使用它。(在JS中没用?)
请参阅以下示例:
TypeScript代码:
// 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网站上托管了这个库,如果有人在寻找类似的解决方案,他们可以使用它,我会慢慢增强它。感谢
基本上,您的理解已经相当正确了。回答您的一些问题:
TypeScript不会保证您的代码能够运行。您可以使用";任何";强制转换或具有非严格类型的库或一些将回退到";任何";类型,如果TypeScript本身无法确定这些类型。
TypeScript是最重要的编译器。它可以编译你的代码,这可能已经使用了旧版本Javascript中不存在的功能,以与旧版本的Javascript兼容。此外,这是最突出的功能,它支持除此之外的某些内置类型语法,在编译代码时可以检查并清除这些语法。
当您构建库时,您可以也应该使用声明文件(*.d.ts)。这些文件具有特殊语法,仅由TypeScript用于忽略某些其他文件或添加全局类型定义。例如,具有一个文件";foo.js";并靠近它";foo.d.ts";,TypeScript将读取";foo.d.ts";相反这就是发布包的方式,因此在使用库时支持不同的构建工具以及不使用TypeScript的项目。
TypeScript的好处在于,那些使用从TypeScript创建的代码(无论是否编译)的人也使用了类型感知系统。例如:
- 您在TypeScript中分发了一个库。其他人也使用自己的TypeScript代码来使用库,如果他们试图做一些不安全的事情(例如
log('a');
),就会看到警告 - 您可以在TypeScript中创建一个库,并在JavaScript中分发它,以及一个
.d.ts
文件,该文件记录了导出的类型。其他人使用自己的TypeScript来使用库,同样的好处也适用 - 你创建了一个类似于上面任何一个的库,而其他人则不使用TypeScript来使用它,但他们使用的是一个支持类型感知的IDE,并设置了一些设置来理解TypeScript的键入(如VSCode)。虽然他们没有完整的TypeScript编译器,但他们至少能够看到不同值的类型,并且如果他们试图做一些明显错误的事情,比如
log('a')
,可能会在IDE中收到警告 - 和上面一样,但库的使用者只使用JavaScript编写,并且没有使用类型感知的IDE——例如,说他们使用Notepad编写。他们不会从你用TypeScript编写库中获得任何好处,因为他们不会看到任何警告,并且可以不安全地执行
log('a');
Typescript不提供任何运行时类型安全性是对的,因为它从不运行;所有TS代码在运行之前总是转换为JS。不过,这并没有真正减少它的价值!
无论何时用Typescript编写程序,代码中包含的每个案例都是正确键入的。这意味着,每当你尝试执行上面所做的操作(将字符串放入数字函数中)时,它都会向你显示一个错误,希望不会被transfile。因此,只要您始终注意编辑器中的警告和错误,您的代码就会(实际上)具有运行时类型安全性。
不过也有一些例外。每当我们从外部源(例如npm-packages或API-calls)接收对象时,我们不能总是确保这些对象具有我们期望的形状。也许API发生了更改,或者npm-package没有类型。在这些情况下,在任何地方都使用any
类型可能很诱人。
不要使用any
。在这一点上,您还不如编写JS。
如果数据的格式未知,请使用unknown
类型,然后对数据进行检查,直到可以将其强制转换为类型或引发错误为止。
tl;dr:TS只提供compiletime类型的安全性,但这仍然很好!