👋 有JSDoc还需要TypeScript吗?

阿轩的BUG
文章191
评论56
标签101
站点日志
作者总数:1位
置顶文章:0篇
标签总数:101条
文章总数:196篇
评论总数:56条
微语总数:149条
运行天数:2314天
最近更新:2024-09-30
文章标签
最新评论
Sherlock
2025-08-21
不是应该打包成apk文件吗,怎么突然就运行编译了,下一步呢
老金er
2025-05-25
人生设计非常必要,在信息化发达的今天,周围大部分人依然只能过着人生工程模式生活,长时间生活洗礼后,尽管“人生工程”已经不再适合很多人,他们也无法做出任何改变,人生设计给我们提供了新的思路,值得尝试
赏帮赚
2025-05-25
职场太多的尔虞我诈
三笑
2024-08-16
emlog6.0.1可以升级支持吗?
pony
2024-07-08
这篇文章提供了一种新的人生规划方法——"人生设计",它借鉴了产品设计的理念,鼓励人们以创造性和探索性的方式思考和规划自己的生活。以下是对这篇文章的几个评价维度: 创新性:将产品设计的理念应用于人生规划是一个新颖的视角,为人们提供了一种跳出传统生活轨迹,探索个性化生活路径的方法。 实用性:文章不仅提出了理念,还详细介绍了具体的实施步骤,包括自我评估、制定计划、原型设计和实践选择等,具有很强的操作性。 启发性:通过强调好奇心、不断尝试、重新定义问题等心态,文章鼓励人们打破常规,勇于探索未知,这对于激发个人潜能和创造力具有积极作用。 适应性:"人生设计"理念适用于不同人生阶段和不同背景的人,无论是希望从头开始的人,还是已经取得一定成就但希望探索新方向的人,都可以从中获得启发。 情感共鸣:文章对许多人对传统生活轨迹的不满和对改变的渴望进行了深刻的洞察,能够引起读者的共鸣。 可持续性:人生设计强调的是一个持续迭代和试错的过程,这与现实生活的发展规律相吻合,有助于人们在不断变化的环境中做出适应性调整。 教育意义:作为一种人生规划方法,"人生设计"可以作为教育的一部分,帮助年轻人更早地学会自我探索和规划,为未来的生活和职业发展打下基础。 局限性:尽管"人生设计"提供了一种新的思考框架,但它可能需要个人具备一定的自我认知和反思能力,对于一些缺乏自我探索经验的人来说,可能需要额外的指导和支持。 总体来说,这篇文章提供了一种有价值的人生规划方法,对于那些渴望改变、寻求个性化生活的人来说,是一种有益的参考和指导。
首页实用干货 🌋

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

上一篇
👫 有效的Git团队协作实践,拒当“分支恐怖分子”
下一篇
🤡 低效能人士的7个习惯