如何用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
相关产品推荐
相关产品推荐

