我具有以下功能:
const fn = async (bool, num, str) => {
// ...
};
bool
是一个布尔值,num
是数字str
是可选字符串我还有以下HOF,如果调用者未传递最后一个可选参数,则它允许在调用时填充它。
const hof = (callback) => { return async (...args) => { if (args.length) { const lastArg = args[args.length - 1]; if ("string" === typeof lastArg) { return callback(...args); } } const s = await findString(); return callback(...[...args].concat(s)); }; };
这可以写:
const fn = hof(async (bool, num, str) => { // str will be valued, either by the caller, or by the hof });
[我如何完全输入
hof
,知道它不知道回调的参数(即,它们可能因一种用法而异)?使用TypeScript甚至可以做到吗?
我设法通过泛型处理了返回的类型:
const hof = <R>( callback: (...args: any) => Promise<R> ): (...args: any) => Promise<R> => { return async (...args) => { // ... }; };
但是可以输入那些动态参数,以便在使用
const fn = hof(async (bool, num, str) => { ... });
时,fn
仅根据回调参数接受参数吗?fn
签名和回调一个之间的唯一区别是,fn
允许未定义的str
最后一个参数,而回调具有强制性。
未编译,但遵循以下原则:
const hof = <R>( callback: (...args: ???, s: string) => Promise<R> ): (...args: ???, s?: string) => Promise<R> => { return async (...args) => { // ... }; };
[仅在我碰到XY problem的情况下,实际使用情况是MySQL transaction management。这种模式允许我在没有连接通过的情况下自动启动一个新事务,或者在调用者的连接已经开始进行事务的情况下使用它的连接。正在讨论此实现here,但简而言之,即我的现实生活
hof
:
const transactional = (run) => async (...args) => { if (args.length) { const lastArg = args[args.length - 1]; if (lastArg && "PoolConnection" === lastArg.constructor.name) { return run(...args); } } return _transactional(async (connection) => run(...[...args].concat(connection))); };
如果您正在考虑更好的方法,请大声喊叫;)
我具有以下功能:const fn = async(bool,num,str)=> {// ...}; bool是一个布尔值,num是一个数字str是一个可选字符串我也有以下HOF,它允许...
我认为您将很难在打字稿中实现这一目标,至少现在很难。我希望能够给出一个正确的答案,但我一直找不到一个好的解决方案。