首页 > 其他分享 >有JSDoc还需要TypeScript吗

有JSDoc还需要TypeScript吗

时间:2023-05-31 21:22:44浏览次数:44  
标签:需要 JavaScript ts param TypeScript JSDoc 类型

这听起来是不是很耳熟:你想写一个小型脚本,不管是为页面、命令行工具,还是其他什么类型。你从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类型注释可能更容易。

以上就是本文的全部内容,如果对你有所帮助,欢迎点赞、收藏、转发~

标签:需要,JavaScript,ts,param,TypeScript,JSDoc,类型
From: https://www.cnblogs.com/chuckQu/p/17447356.html

相关文章

  • 我们的智能化应用是需要自动驾驶(Autopilot)还是副驾驶(Copilot)
    自动驾驶Autopilot是一个知识密集且科技含量很高的技术,不基于点什么很难把它讲的相对清楚。副驾驶Copilot是一种由AI提供支持的数字助理,旨在为用户提供针对一系列任务和活动的个性化协助。自微软发布Microsoft365Copilot以来,Copilot这个词便被各界人士不断提及。"Copil......
  • 使用同步带模组需要注意的事项
    提到直线模组,相信大家都非常熟悉了,直线模组的种类很多,一般用于自动化设备,其中,丝杆模组和同步带模组是直线模组中使用率较多的两种。在工业自动化时代,同步带模组得到了广泛的应用,那么我们在使用同步带模组时需要注意哪些问题呢?首先我们应该考虑使用环境,在恶劣的环境下,我们一般都要选......
  • APP开发公司怎么选择好?需要考虑哪些因素?
    随着移动互联网的快速发展,越来越多的企业开始重视APP的开发和推广,而选择一家好的APP开发公司则成为了关键。那么,好的app开发公司都有哪些特点呢?下面思久科技就来介绍一下。专业的团队和技术实力好的APP开发公司一般都拥有专业的开发团队和技术实力,能够根据客户需求,提供完整的开发服......
  • 技术 | 你需要知道的关于软件开发中的人工智能
    【本文由CloudAce整理,CloudAce 是谷歌云全球战略合作伙伴,拥有300多名工程师,也是谷歌最高级别合作伙伴,多次获得GoogleCloud合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训服务。】令人惊讶的是,这些年来技术发展迅速,而且还在继......
  • 前端 React + vite + Typescript 后端 java + springmvc + jwt 跨域 解决方案
    首先后端配置跨域:web.xml文件: <!--配置跨域--><filter><filter-name>header</filter-name><filter-class>org.zhiyi.config.Cross</filter-class></filter><filter-mapping><......
  • 你问我做技术研发需要哪些能力?
    要回答者问题其实很简单,咱们把眼光投射到具体的公司上。首先先需要明确公司找一个人来是要做什么?显而易见,就是要去负责一块儿业务。那么,负责一块儿业务应该具备哪些能力呢?一、技术能力这个是基础,无需多言,厨师不配刀还叫什么厨师!不同的公司有着不同的业务,或者即便是相同的业......
  • 聚类算法:ISODATA算法 ——kmeans算法升级版,不知道k也可以,但是需要你自己指定其他参数
    当K值的大小不确定时,可以使用ISODATA算法。ISODATA的全称是迭代自组织数据分析法。在K均值算法中,聚类个数K的值需要预先人为地确定,并且在整个算法过程中无法更改。而当遇到高维度、海量的数据集时,人们往往很难准确地估计出K的大小。ISODATA算法就是针对这个问题进行了改进,它的思想......
  • dockerfile镜像私有仓库需要https登录验证改成http
    ERROR:failedtodorequest:Head"https://192.168.16.185:8088/v2/jenkins/python_common_api/manifests/base":http:servergaveHTTPresponsetoHTTPSclientDockerfile:1--------------------1|>>>FROM192.168.16.185:8088/jenkins/p......
  • 架构师成长需要具备的三种能力
    1、思考力思考力是在我们生活和工作中,通过独立思考带来有效结论的能力。首先是独立思考。独立,并不是避免跟别人讨论,或者是不上网查资料、不参加会议。而是指得出的结论,主要来自如下三个方面:有别于其他人的视角;不同的证据组合;不同的思维方式。其次是“有效”,也就是为公司或团队带来......
  • AngularJS2.0 quick start——其和typescript结合需要额外依赖
    AngularJS2发布于2016年9月份,它是基于ES6来开发的。运行条件!由于目前各种环境(浏览器或Node)暂不支持ES6的代码,所以需要一些shim和polyfill(IE需要)让ES6写的代码能够转化为ES5形式并可以正常运行在浏览器中。从上图可以看出在Es5浏览器下需要以下模块加载器:systemjs -通用模块......