用于JavaScript reducer累加器的Typescript的JSDoc类型

时间:2018-09-03 15:16:11

标签: javascript typescript jsdoc

我正在尝试使用JSDocs在JavaScript reducer中键入累加器,但无法解决该问题。

我尝试在初始化时内联键入它,但是没有用。有任何提示或想法吗?这是示例代码。它抱怨传递给arr.push()的参数:

/**
* @type {Array<String>}
*/
const arr = ['one', 'two', 'three'];

/**
 * @type {Array<Array>}
 */
const result = arr.reduce((acc, item) => {
   if(item.length % 3 === 0) {
     // [ts] Argument of type '(string | number)[]' is not assignable to
     // parameter of type 'never'.
     acc.push([item, item.length]);
   }
   return acc;
}, []);

这是GitHub存储库,在项目根目录中有tsconfig.json文件用于tsc设置:https://github.com/guyellis/typescript-as-a-linter

这是该存储库中的文件,我从上面获取了上面的代码:https://github.com/guyellis/typescript-as-a-linter/blob/master/lib/reducer.js

2 个答案:

答案 0 :(得分:2)

作为初始状态传递的空数组的类型为never[]。有关更多背景信息,请参见this thread。为了避免这种情况,您可以将其放在常量中并为常量指定类型:

/**
* @type {Array<String>}
*/
const arr = ['one', 'two', 'three'];

/** @type {Array<[string, number]>} */
const init = [];

/**
 * @type {Array<[string, number]>}
 */
const result = arr.reduce((acc, item) => {
   acc.push([item, item.length]);
   return acc;
}, init);

答案 1 :(得分:0)

/**
 * @param {Pose['parameterValues']} values
 * @param {Pose['variants']} variants
*/
function getSrc (values, variants) {
  return values.reduce(
    /** @param {{[key: string]:Array<string>}} paths */
    (paths, { camera, light }, index) => {
      paths[light.name] = []
      for (let c = camera.start; c < camera.end; c += camera.increment) {
        paths[light.name].push(
          variants[index].replace('light', light.value).replace('camera', String(c))
        )
      }
      return paths
    }, {})
}