如何用打字稿描述简单的Just函子的接口? [英] How to describe the interface of a simple Just functor in typescript?

查看:120
本文介绍了如何用打字稿描述简单的Just函子的接口?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图第一次用打字稿编写一个简单的界面,并对几乎所有内容都有疑问.

问题很简单.如何描述这个简单的玩笑匹配器扩展?

 /**
 * @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 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/jest/index.d.ts#L471 .

解决方案

扩展名

您对Matchers的合并几乎是正确的,但是通过查看确定类型[1]"上的笑话类型,我可以看到Matchers嵌套在jest名称空间内. 命名空间合并.

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;

这是让我感到困惑的地方.如果您对问题的这一部分有疑问,请告诉我,我将尽力提供帮助.

I'm trying to write a simple interface in typescript for the first time and having doubts about pretty much everything.

The question is simple. How to describe this simple jest matcher extension?

/**
 * @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))
})

I have tried this but not sure about the generic types at all:

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
}

Ref: JSDoc document object method extending other class

The gist of the jest type definition for 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.
}

Well, this is confusing. The only index.d.ts in the jest repo is https://github.com/facebook/jest/blob/master/packages/jest-editor-support/index.d.ts but that is not the one I get in vscode, which is https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/jest/index.d.ts#L471.

解决方案

The extension

Your merge of Matchers is almost right, but from looking at the jest types on Definitely Typed [1], I can see that Matchers is nested inside a jest namespace. The part of the Typescript handbook that covers this is namespace merging.

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

When I tested this, I needed a tsconfig.json to get my JS files to see the declaration:

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

A jsconfig.json is almost the same thing, but doesn't require you to add "allowJs": true explicitly. But note that adding a tsconfig or jsconfig will turn off automatic downloads of types from Definitely Typed, and you'll have to manually npm install @types/jest (plus any other types for libraries you use). If you don't want to add a tsconfig, I was able to manually add a reference in the JS file as the first line:

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

The type of the new method

It should be something like:

functorToBe(expected: R): R;

Here is where things get confusing to me. Let me know if you have questions about this part of the problem and I will try to help.

这篇关于如何用打字稿描述简单的Just函子的接口?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆