根据对象键检查函数以获取无效参数

时间:2019-05-10 06:13:50

标签: node.js typescript

下面我有一个函数,该函数可简化对象并将结果分配给对象,该对象的键与它所命名的功能的键有关。

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

这可能吗?

0 个答案:

没有答案