Как описать интерфейс простого функтора Just в машинописи? - PullRequest
0 голосов
/ 29 августа 2018

Я впервые пытаюсь написать простой интерфейс для машинописного текста и сомневаюсь почти во всем.

Вопрос прост. Как описать это простое расширение jest matcher?

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

expect.extend({
  /** Compare the two values inside two functors with Object.is
   * @method
   * @augments 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}`
      }
    }
  }
})

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

Я пробовал это, но не уверен насчет универсальных типов:

import { Matchers } from 'jest'

interface Functor<T> {
  (value?: any): {
    fmap: (f: value) => Functor<T>
  }
}

interface Matchers<R> {
  functorToBe(actual: Functor<T>, expected:  Functor<T>): R
}

Ссылка: Метод объекта документа JSDoc, расширяющий другой класс

Суть определения типа шутки для Matchers<R>:

/**
 * The `expect` function is used every time you want to test a value.
 * You will rarely call `expect` by itself.
 */
interface Expect {
    /**
     * The `expect` function is used every time you want to test a value.
     * You will rarely call `expect` by itself.
     *
     * @param actual The value to apply matchers against.
     */
    <T = any>(actual: T): Matchers<T>;
    /**
     * You can use `expect.extend` to add your own matchers to Jest.
     */
    extend(obj: ExpectExtendMap): void;
    // etc.
}

Ну, это сбивает с толку. Единственное index.d.ts в репозитории Jest - это https://github.com/facebook/jest/blob/master/packages/jest-editor-support/index.d.ts, но это не то, что я получаю в vscode, а это https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/jest/index.d.ts#L471.

1 Ответ

0 голосов
/ 29 августа 2018

расширение

Ваше слияние Matchers почти правильное, но, глядя на типы шуток в «Определенно типизированном» [1], я вижу, что Matchers вложено в пространство имен jest. Эта часть справочника Typescript охватывает это слияние пространства имен .

namespace jest {
    export interface Matchers<R> {
        functorToBe<T>(actual: Functor<T>, expected:  Functor<T>): R;
    }
}

Когда я проверял это, мне понадобился tsconfig.json, чтобы мои JS-файлы увидели объявление:

{
    "compilerOptions": {
        "allowJs": true,
        "checkJs": true,
    },
    "include": [
        "test.js",
        "extensions.ts",
    ]
}

jsconfig.json - это почти то же самое, но не требует явного добавления "allowJs": true. Но обратите внимание, что добавление tsconfig или jsconfig отключит автоматическую загрузку типов из «Определенно типизированного», и вам придется вручную npm install @types/jest (плюс любые другие типы для используемых вами библиотек). Если вы не хотите добавлять tsconfig, я смог вручную добавить ссылку в файле JS в качестве первой строки:

/// <reference path="./extensions.ts" />

Тип нового метода

Это должно быть что-то вроде:

functorToBe(expected: R): R;

Здесь вещи меня смущают. Дайте мне знать, если у вас есть вопросы по этой части проблемы, и я постараюсь помочь.

...