typescript - 使用 fp-ts 重写一个用记录器包装的小函数

标签 typescript fp-ts

我想尝试使用 fp-ts 重写代码的某些部分,并考虑重构以下方法:

export const createApiServer = () => {
    logger.info("Starting World Server API");

    const apiServer = express()
        // 3rd party middleware
        .use(helmet())
        .use(bodyParser.json())
        .use(cors())
        // Root route
        .get("/", (_, result) => result.sendStatus(httpStatusCodes.OK))
        // 404 - Not Found
        .use((_, result) => result.sendStatus(httpStatusCodes.NOT_FOUND))
        // 500 - Internal Server Error
        .use(errorLoggerMiddleware)
        .use(errorResponseMiddleware);

    logger.verbose(`Initialized World Server API in ${process.uptime().toFixed(3)} seconds`);

    return apiServer;
};

在阅读了副作用的 IO 类型后,我尝试按如下方式使用它:

const info = (message: string) => new IO(() => log.info(message));
const verbose = (message: string) => new IO(() => log.verbose(message));

const setupApiServer = () =>
    new IO(() =>
        express()
            .use(helmet())
            .use(bodyParser.json())
            .use(cors())
            .get("/", (_, result) => result.sendStatus(httpStatusCodes.OK))
            .use((_, result) => result.sendStatus(httpStatusCodes.NOT_FOUND))
            .use(errorLoggerMiddleware)
            .use(errorResponseMiddleware)
    );

export const createApiServer = () =>
    info("Starting World Server API")
        .chain(setupApiServer)
        .chain((apiServer) =>
            verbose(`Initialized World Server API in ${process.uptime().toFixed(3)} seconds`)
                .map(() => apiServer)
        )
        .run();

在最后一个链调用中任意使用 map 方法通过 apiServer 对象进行管道传输,只是为了在接收它和进一步发送它之间登录,这感觉相当奇怪。我想知道这是否正确,或者是否有任何不同的模式。

最佳答案

您可以使用chainFirst

使用chainFirst,您可以重构它

import { pipe } from "fp-ts/lib/pipeable";
import * as IO from "fp-ts/lib/IO";

declare const log: (m: string) => IO.IO<void>
declare const a: IO.IO<number>

pipe(
  a,
  IO.chain((a) => pipe(log(`Got ${a}`), IO.map(() => a)))
)

进入此

pipe(
  a,
  IO.chainFirst((a) => log(`Got ${a}`))
)

关于typescript - 使用 fp-ts 重写一个用记录器包装的小函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56012894/

相关文章:

fp-ts - FP-TS 的 IO 消耗

typescript - 如何制定强制通用类实例适合给定接口(interface)的约束?

testing - 在 Angular 2 中加载外部 css 并进行测试

javascript - 在 setTimeout() 的回调中获取计时器 ID?

typescript - 在 Typescript 中,为数组定义一个类型,其中第一个元素比其余元素更具体

typescript - TypeORM 多对多连接表额外列

typescript - 如何将 Either 与异步函数一起使用

typescript - 具有未知键的属性的 Io-ts 接口(interface)

typescript - fp-ts - 不推荐使用管道

typescript - 如何折叠两种不同的类型? FP-TS