You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JSDoc+TypeScript为JavaScript函数添加类型标注?

2023年更新

我做了一场关于如何使用tsc+JSDoc的演讲,解答了这个问题及更多相关内容。
我还创建了一个工具包来简化tsconfig的模板配置,执行以下命令即可初始化:

npx jswt init
原始问题

我尝试在原生JavaScript中使用tsc,但不知道如何为函数声明类型。我原本以为写法应该很简单:

/** @type PersonGreet */
person.greet = function greet(other) {
  return `Hello ${other.name}, my name is ${person.name}!`;
};

编辑补充:/** @type PersonGreet */的写法是正确的。当前出现的问题是tsc的一个bug,下方的精选答案提供了有效的解决办法。

简化测试用例

请忽略有人可能建议将代码重构为类或原型写法的情况,这个示例只是为了演示问题。

"use strict";

/**
 * @typedef {Object} Person
 * @property {String} name
 * @property {PersonGreet} greet
 */

/**
 * @typedef {Function} PersonGreet
 * @param {Person} other
 * @returns {String}
 */

let Person = {};

/**
 * 创建一个Person实例
 * @param {Object} p
 * @param {String} p.name
 * @returns {Person}
 */
Person.create = function (p) {
  let person = {};

  person.name = p.name;

  /////////////////////////////////////////////////////////////////////////////////
  //
  // 错误 TS7006: 参数'other'隐式拥有'any'类型。  <======= 错误!
  //
  /////////////////////////////////////////////////////////////////////////////////

  /** @type PersonGreet */
  person.greet = function greet(other) {
    return `Hello ${other.name}, my name is ${person.name}!`;
  };

  return person;
};

module.exports = Person;

被错误标记为"any"类型

当我运行tsc进行类型检查时,出现了关于隐式any类型的错误:
执行命令:

tsc -p jsconfig.json

错误输出:

person.js:28:33 - error TS7006: Parameter 'other' implicitly has an 'any' type.

28   person.greet = function greet(other) {
                                   ~~~~~


Found 1 error in person.js:28

解决方案?

在我看来这似乎是tsc的一个bug……但这是JavaScript的基础用法,肯定有办法为函数标注类型吧?我需要使用哪种注释来声明函数的类型?还是说tsc/tsserver/typescript无法处理这种基础的JavaScript用法?

内容的提问来源于stack exchange,提问作者root-aj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:30:12