如何添加适当的类型以简化功能?

时间:2019-09-07 11:39:41

标签: typescript

在我下面有一个名为C:\Program Files\MySQL\MySQL Shell 8.0\bin\; C:\Users\nick\AppData\Roaming\npm\node_modules\ionic\bin; C:\Users\nick\AppData\Roaming\npm\node_modules\cordova\bin; 的函数,其目的是采用一个值为j的{​​{1}}并依次解析每个对象object(减少),并将函数的返回值分配给其相应的键。

函数本身很简单,即functions,它也可以解析承诺值,允许value-functions为property,并将结果分布在累积的对象上。

每个函数都可以访问传入的参数以及每个以前的函数的键返回值。

我正在尝试键入此函数_.reduce,以便在async返回的函数上进行明智的键入。在下面的示例中,j函数采用一个j属性,并且该对象中没有customAnimal键,因此很明显,该值必须是animal返回的函数。

animal
j

键入这样的函数似乎很复杂,但事实并非如此。是否有任何泛型可以将每个函数中的所有import * as _ from 'lodash'; export const isPromise = (obj) => !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function' type ValueOf<T> = T[keyof T]; type Jin = { [key: string]: Function } const j = (objFns: Jin): Function => { /** Parameters<> object where combind all parameters from all object values */ /** ReturnType<> all object keys with types as return types from functions, merged with original args */ return (input) => { return _.reduce(_.toPairs(objFns), (acq, pair) => { const [key, fn] = pair const handleResult = (acq, result) => { const addition = { [key]: result} return { ...acq, ...addition } } const handleResultPossiblePromise = (acq, result) => { const resultIsPromise = isPromise(result) if (resultIsPromise) return result.then(result => handleResult(acq, result)) return handleResult(acq, result) } const handleAcqPossiblePromise = (acq) => { const acqIsPromise = isPromise(acq) if (acqIsPromise) return acq.then(acq => handleResultPossiblePromise(acq, fn(acq))) return handleResultPossiblePromise(acq, fn(acq)) } return handleAcqPossiblePromise(acq) }, input) } } const makePoem = j({ color: () => 'blue', sky: ({ color }) => `the color of the sky is ${color}`, ocean: ({ color }) => `the color of the ocean is ${color}`, customAnimal: ({ animal, color }) => `the color of the ${animal} is ${color}`, poem: ({ sky, ocean, customAnimal }) => [sky, ocean, customAnimal].join('\n'), }) console.log(makePoem({ animal: 'cat' })) 组合在一起,甚至可以将Diff与提供的参数一起使用?声明Merge<>时是否可以定义Parameters<>需要什么?类似于j的样式组件如何?

如何键入j,以便正确键入函数withProps<IProps, HTMLDivElement>(styled.div)

0 个答案:

没有答案