如何使用JSDoc + TypeScript编写JavaScript函数?

18 浏览
0 Comments

如何使用JSDoc + TypeScript编写JavaScript函数?

我试图在纯粹的Vanilla JS中使用,但在声明函数的类型时遇到了困难。\n看起来应该很简单:\n

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

\n编辑: /** @type PersonGreet */是正确的。当前行为是tsc中的一个错误。下面选择的答案提供了有效的解决方法。\n

简化的测试用例

\n忽略某人可能想要将其重构为使用类或原型等 - 它很好地展示了问题。\n仓库: https://github.com/BeyondCodeBootcamp/hello-tsc\n

"use strict";
/**
 * @typedef {Object} Person
 * @property {String} name
 * @property {PersonGreet} greet
 */
/**
 * @typedef {Function} PersonGreet
 * @param {Person} other
 * @returns {String}
 */
let Person = {};
/**
 * 创建一个人
 * @param {Object} p
 * @param {String} p.name
 * @returns {Person}
 */
Person.create = function (p) {
  let person = {};
  person.name = p.name;
  /////////////////////////////////////////////////////////////////////////////////
  //
  // error TS7006: 参数'other'隐式具有'any'类型。   <======= 错误!
  //
  /////////////////////////////////////////////////////////////////////////////////
  /** @type PersonGreet */
  person.greet = function greet(other) {
    return `Hello ${other.name}, my name is ${person.name}!`;
  };
  return person;
};
module.exports = Person;

\n

错误地被标记为\"any\"

\n当我运行进行检查时,它会报一个关于隐式any的错误:\n

tsc -p jsconfig.json

\n

person.js:28:33 - error TS7006: 参数'other'隐式具有'any'类型。
28   person.greet = function greet(other) {
                                   ~~~~~
在person.js中找到1个错误:28

\n

怎么办?

\n对我来说,这似乎是中的一个错误... 但这是JS 101的东西,肯定有一种方法可以给函数加上类型?\n我需要使用什么注释来声明函数的类型?或者 / / 无法处理这种基本的JS使用方式?

0
0 Comments

问题:如何使用JSDoc + TypeScript来编写JavaScript函数?

解决方案1:

你应该使用而不是,代码如下:

"use strict";
/**
 *  {Object} Person
 *  {String} name
 *  {PersonGreet} greet
 */
/**
 *  PersonGreet
 *  {Person} other
 *  {String}
 */
let Person = {};
/**
 * Creates a person
 *  {Object} p
 *  {String} p.name
 *  {Person}
 */
Person.create = function (p) {
  let person = {};
  person.name = p.name;
  /**  {PersonGreet} */
  person.greet = function greet(other) {
    return `Hello ${other.name}, my name is ${person.name}!`;
  };
  return person;
};
module.exports = Person;

解决方案2:

或者,使用TypeScript语法声明一个,代码如下:

/**
 *  {(other: Person) => string} PersonGreet
 */

附注:似乎tsc完全无法识别

0