[英]Simplify fp-ts function
我有这个功能:
export const getProducts = makeRequest(
/** Your query */
`asasd*[_type == "product"] {
_id,
title
}`,
/** Optionally transform the response */
(i) => i,
/** Validate exact type */
D.array(Product)
);
这是类型:
const getProducts: TaskEither<Error, {
_id: string;
title: string;
}[]>
这在 Next.js API 路由中使用,如下所示:
export default async (
_: NextApiRequest,
res: NextApiResponse<Array<Product>>
) => {
const request = await getProducts();
return pipe(
request,
E.fold((v) => res.status(400).end(v.message), res.status(200).json)
);
};
它工作,但我怎样才能简化最后一个功能? 我希望await getProducts()
在管道中内联,所以我不必预先进行request
分配。
您可以使用Task
模块中的map
:
import * as T from 'fp-ts/Task'
export default async (
_: NextApiRequest,
res: NextApiResponse<Array<Product>>;
) => pipe(
request,
T.map(E.fold((v) => res.status(400).end(v.message), res.status(200).json))
)();
pipe(request, T.map(...)))
返回一个Task
,因此您必须在最后调用它才能执行它。
如果你真的想避免最后的()
,你可以这样做:
const runTask = async <A>(task: T.Task<A>): Promise<A> => task();
export default async (
_: NextApiRequest,
res: NextApiResponse<Array<Product>>;
) => pipe(
request,
T.map(E.fold((v) => res.status(400).end(v.message), res.status(200).json)),
runTask
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.