下面我有一个函数,该函数可简化对象并将结果分配给对象,该对象的键与它所命名的功能的键有关。
import * as lodash from 'lodash';
export const isPromise = (obj) => !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
export const series = (obj, handler?) => {
const reducable = lodash.toPairs(obj);
const v = reducable.reduce((a: any | Promise<any>, [key, fn]) => {
const addValue = (a, v) => {
if (isPromise(a) && isPromise(v)) return a.then(a, v.then(v => addValue(a, v)))
if (isPromise(a)) return a.then(a => addValue(a, v))
if (isPromise(v)) return v.then(v => addValue(a, v))
a[key] = v;
return a;
}
if (typeof fn !== 'function') return addValue(a, fn);
if (isPromise(a)) return a.then(a => addValue(a, fn(a)))
return addValue(a, fn(a))
}, {})
if (!handler) return v;
if (isPromise(v)) return v.then(handler);
return handler(v);
}
series({
a: Promise.resolve('a+'),
b: ({ a }) => Promise.resolve(`b+ uses a as:${a}`),
c: Promise.resolve('c+'),
}).then(console.log)
此示例有效。
但是,我想添加一个打字稿类型检查,该检查不允许使用未在堆栈中声明为更高的变量。
series({
a: Promise.resolve('a+'),
b: ({ a, z }) => Promise.resolve(`b+ uses a as:${a}`),
c: Promise.resolve('c+'),
}).then(console.log)
这应该引发打字错误,因为z
上方的任何先前键均未设置b
。
这可能吗?