0

0

使用 JSDoc 注释泛型函数时 TypeScript 报错问题解析

碧海醫心

碧海醫心

发布时间:2025-09-23 16:43:01

|

324人浏览过

|

来源于php中文网

原创

使用 jsdoc 注释泛型函数时 typescript 报错问题解析

本文深入探讨了在使用 JSDoc 注释泛型函数时,@type 和 @param/@return 表现不同的原因,并提供了使用 @typedef 解决相关问题的方案。通过具体示例和代码片段,帮助开发者理解 TypeScript 如何解析 JSDoc 注释中的泛型类型,并避免在使用过程中可能遇到的错误。

在使用 JSDoc 注释 TypeScript 代码时,我们可能会遇到一些意想不到的问题,尤其是在处理泛型函数时。一个常见的问题是,使用 @type 注释泛型函数时,TypeScript 可能会报错,而使用 @param 和 @return 则可以正常工作。本文将深入探讨这个问题的原因,并提供一些解决方案。

问题描述

考虑以下代码片段:

/**
 * @template X
 * @type {function(X): X}
 */
const identity1 = (x) => x;

/**
 * @template X
 * @type {function(X): X}
 */
const identity2 = (x) => identity1(x);

这段代码在 TypeScript 中会产生以下错误:

Type 'X' is not assignable to type 'X'. Two different types with this name exist, but they are unrelated.
  'X' could be instantiated with an arbitrary type which could be unrelated to 'X'.ts(2719)
graph.mjs(4, 14): This type parameter might need an `extends X` constraint.
const identity1: (arg0: X) => X
@template X
@type — {function(X): X}

然而,如果我们将 @type 替换为 @param 和 @return,代码就可以正常工作:

/**
 * @template X
 * @param {X} x
 * @returns {X}
 */
const identity1 = (x) => x;

/**
 * @template X
 * @type {function(X): X}
 */
const identity2 = (x) => identity1(x);

问题原因

问题的根源在于 TypeScript 如何解析 JSDoc 注释中的类型信息。使用 @type 标签定义的类型的作用域仅限于花括号内部。这意味着 @type {function(X): X} 中的 X 实际上并没有引用到 @template X 定义的泛型类型。TypeScript 无法正确地将 @type 标签中声明的类型与外部的泛型类型参数关联起来。

简单来说,TypeScript 对 @type 标签的处理方式,并不能完全支持从 @type 中提取泛型类型信息。

AI智研社
AI智研社

AI智研社是一个专注于人工智能领域的综合性平台

下载

解决方案

一种解决方案是使用 @typedef 标签。@typedef 允许我们定义更复杂的类型,并且可以正确地处理泛型类型参数。

以下是一个使用 @typedef 的示例:

/**
 * @template X
 * @typedef {X extends number ? [1, 2, 3][X] : never} Successor
 */

/**
 * @template X
 * @typedef {X} Identity
 */

/**
 * @template X
 * @typedef {Identity>} Identity2
 */

/** @type {Successor>} */
const x = 2;

在这个例子中,我们首先使用 @template 定义了泛型类型参数 X,然后使用 @typedef 定义了 Successor、Identity 和 Identity2 类型。这些类型可以正确地引用泛型类型参数 X。

总结

在使用 JSDoc 注释 TypeScript 代码时,需要注意 @type 标签对泛型类型的处理方式。如果遇到相关问题,可以考虑使用 @param 和 @return 或者 @typedef 标签来替代 @type。

注意事项:

  • 在编写 JSDoc 注释时,请务必参考 TypeScript 官方文档,了解各种标签的正确用法和限制。
  • 在定义泛型类型时,尽量使用 @param 和 @return 标签,或者使用 @typedef 标签来确保类型信息的正确性。
  • 仔细阅读 TypeScript 编译器的错误信息,可以帮助你快速定位问题并找到解决方案。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

109

2023.09.26

c语言typedef的用法
c语言typedef的用法

c语言typedef的用法有定义基本类型别名、定义结构体别名、定义指针类型别名、定义枚举类型别名、定义数组类型别名等。本专题为大家提供typedef相关的文章、下载、课程内容,供大家免费下载体验。

98

2023.09.26

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

484

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

163

2023.10.07

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

9

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

8

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

3

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.6万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号