使用字符串键和函数值定义对象的类型

时间:2019-10-04 13:17:34

标签: node.js typescript generics functional-programming

我有一个带有一个参数的节点JS函数,它是一个带有键的对象,而值是可以解析为基础值的函数。

我们刚刚切换到TS,但我不知道如何定义参数的key:value类型,而且我不知道如何将function定义为值类型?

TS函数如下所示...

const myJSFunction = o => input => ...

其中ostring:function对象。然后input传递到values的每个函数o中。

所以我正在考虑在...方面有一些签名。

// define the generic <R> function as <U => any>
// define the generic <T> as an object of { string : R }
const myTSFunction = (o: T) => (input: U) => ...

还是什么?我在这里抓着稻草,因为我不太了解Typescript,以至于无法了解泛型。

谢谢

2 个答案:

答案 0 :(得分:1)

那这样的事情呢?

// We define what the type o is
// key: string means "any key should ..."
interface Obj<T> {
  [key: string]: (input: T) => void,
};

// We instantiate an object for the test
const o: Obj<string> = {
  a: (input) => { },
  b: (input) => { },
};

// We define the function to work with any type of value of obj
// and call it for the test
function myTSFunction<T>(obj: Obj<T>, val: T): void {
  obj[0](val);
}

答案 1 :(得分:0)

GrégoryNEUT的答案很有帮助,但是我在途中发现了其他一些限制(JS一直躲藏着)。我正在使用Lodash,所以我的对象不仅仅是一个对象,而是他们定义的类型。

所以我定义了一些新类型...

type TransformerFunction<T> = (o: T) => any;
type TransformerObject<T> = Dictionary<TransformerFunction<T>>;

然后功能变成...

export const objectTransform = <T extends any>(o: TransformerObject<T>) => <U extends T>(json: U): Dictionary<any> => _.flow(
  _.mapValues((f: TransformerFunction<T>) => f(json)),
  _.omitBy(_.isUndefined),
  _.omit('undefined'),
)(o);

这就是我一直在JS中转换JSON,现在将其移至TS并喜欢泛型的方式。