这听起来是不是很耳熟:你想写一个小型脚本,不论是为页面、命令行工具,还是其余什么类型。你从JavaScript开始,直到你想起写代码时没有类型是如许苦楚。所以你把文件从.js重命名为.ts。而后意识到你曾经关上了一个麻烦的玩意儿。

如果你在为一个网站或一个库写代码,你就须要引入编译的步骤。如果你在编写CLI脚本,你能够求助于Deno(它反对TypeScript,开箱即用),然而你须要设置你的IDE来了解Deno的API,而且混合和匹配Deno和node并不总是那么容易。

一旦你在本地实现了所有工作,你就须要思考如何散发你的代码。你会查看你编译的.js文件吗?你会创立一个CI管道来主动编译你的.ts文件吗?如果你在写一个库,你如何公布你的库,以便它能够被其余我的项目应用?

你实际上不须要TypeScript

问题是......你不须要为了取得动态类型剖析而编写TypeScript!

你能够通过应用JSDoc在JavaScript中取得TypeScript的所有益处

TypeScript所提供的是一个动态类型零碎。这意味着类型信息在运行代码中没有影响。当你的TypeScript被执行时,所有的类型信息都会齐全失落(这就是为什么你不写一个类型守卫,就不能测试一个变量是否是某个类型的起因)。

这也意味着TypeScript只是提供给TypeScript分析器的额定类型信息,对运行你代码的JavaScript引擎没有任何意义。当你把TypeScript编译成JavaScript时,它基本上只是从你的代码中删除了所有的类型信息,所以它又变成了无效的JavaScript代码。

JSDoc

在JavaScript诞生25年多后,JSDoc作为一种正文JavaScript代码的形式被引入。它是一种正式的标记语言,容许IDE在开发者看到一个函数时提供额定的上下文。

相似的正文标记存在于大多数语言中,我置信你曾经晓得它了。这就是它的样子:

/** * This is the JSDOC block. IDEs will show this text when you hover the * printName function. * * @param {string} name */function printName(name) {  console.log(name)}

TypeScript 和 JSDoc

较少人晓得的是,JSDoc是你充沛应用TypeScript所须要的。TypeScript分析器可能了解用JSDoc写的类型,并给你提供与.ts文件雷同的动态剖析。

我不会在这里提供残缺的语法文档。最重要的是你要晓得,简直所有你能在.ts文件中做的事件,你都能用JSDoc来做。但这里有几个例子:

带有原生类型的函数参数:

/** * @param {string} a * @param {number} b */function foo(a, b) {}

应用TypeScript提供的开箱即用的类型:

/** * @param {HTMLElement} element * @param {Window} window */function foo(element, window) {}/** @type {number[]} */let years

定义对象字面量和函数:

/** @type {{ name: string; age: number }} */let person/** @type {(s: string, b: boolean) => void} */let myCallback

*.d.ts文件中导入类型:

/** @param {import('./types').User} user */const deleteUser = (user) => {}

定义一个类型供当前应用:

/** * @typedef {object} Color * @property {number} chroma * @property {number} hue *//** @type {Color[]} */const colors = [  { chroma: 0.2, hue: 262 },  { chroma: 0.2, hue: 28.3 },]

参见官网TypeScript JSDoc文档以取得详尽的列表。

如果你有简单的类型,你依然能够编写你的*.d.ts文件并在你的JSDoc正文中导入它们。

留神,你依然须要为typescript设置你的我的项目(和IDE),你须要创立一个tsconfig.json文件,将编译器选项allowJscheckJs设置为true

// tsconfig.json{  "compilerOptions": {    "allowJs": true,    "checkJs": true    // ...  }}

什么时候写TypeScript

尽管齐全应用JSDoc进行类型申明是可能的,但这并不是最不便的。TypeScript的语法要好得多,而且不那么反复。

TypeScript团队创立了一个"作为正文的类型"ECMAScript提案,容许你编写TypeScript并在不批改的状况下在JavaScript引擎中运行(JavaScript引擎将把这些类型正文视为正文。)

然而在这个提案被承受之前,咱们只能决定应用JSDoc或者TypeScript工具链。

倡议

所以当初我的倡议是这样的:

  • 当你正在做一个有编译步骤的我的项目时,应用TypeScript没有什么害处
  • 然而如果你不须要编译步骤,那么保持应用JSDoc类型正文可能更容易。

以上就是本文的全部内容,如果对你有所帮忙,欢送点赞、珍藏、转发\~