JSDoc文档对象方法扩展其他类

时间:2018-08-22 17:32:25

标签: javascript jestjs jsdoc

使用JSDoc扩展文档匹配器

我写了一个简单的扩展名jest.Matchers,但是我无法通过打字稿类型检查器来识别扩展名。

我正在使用纯JavaScript。

// @ts-check

const getFunctorValue = F => {
  let x
  F.fmap(v => x = v)
  return x
}


expect.extend({
  /**
  * @extends jest.Matchers
  * @param {*} actual The functor you want to test.
  * @param {*} expected The functor you expect.
  */
  functorToBe(actual, expected) {
    const actualValue = getFunctorValue(actual)
    const expectedValue = getFunctorValue(expected)
    const pass = Object.is(actualValue, expectedValue)
    return {
      pass,
      message () {
        return `expected ${actualValue} of ${actual} to ${pass ? '' : 'not'} be ${expectedValue} of ${expected}`
      }
    }
  }
})

/**
* @constructor
* @param {*} v Any value
*/
function just (v) {
  return {
    fmap: f => just(f(v))
  }
}

describe('Functor Law', () => {
  test('equational reasoning (identity)', () => {
    expect(just(1)).functorToBe(just(1))
  })
})

但是与expect(just(1)).functorToBe(just(1))相同, 我在functorToBe下得到红色下划线,并显示以下错误消息:

  

[ts]类型'Matchers <{[x:string]:any;不存在属性'functorToBe' fmap:(f:任何)=>任何; }>'。   任何

我在vscode中写了jest.Matchers后得到了expect(),然后看了一下描述。

enter image description here

更新:我终于在打字稿存储库中提交了以下错误报告:https://github.com/Microsoft/TypeScript/issues/26675

1 个答案:

答案 0 :(得分:0)

当前无法在JSDoc中完成。

  

经过进一步思考,我认为核心问题是,更改Expect类型的语句是一个副作用函数调用,而不是声明。 Typescript没有能力对这样的类型进行突变。

     

我认为短期内最好的选择是使用一个单独的.d.ts文件将类型突变表示为类型合并,如我上面概述的那样,尽管如果它们不适合,可能需要对笑话类型进行一些工作合并。

     

但是,对于想要使用纯Javascript的项目来说,这不是令人满意的解决方案。让我们保持开放状态,以跟踪“突变即合并” jsdoc标签的想法。

来源:https://github.com/Microsoft/TypeScript/issues/26675#issuecomment-416952171

如果有人感兴趣,我对StackOverflow有一个后续问题:How to describe the interface of a simple Just functor in typescript?