我有一个带有一个参数的节点JS函数,它是一个带有键的对象,而值是可以解析为基础值的函数。
我们刚刚切换到TS,但我不知道如何定义参数的key:value类型,而且我不知道如何将function
定义为值类型?
TS函数如下所示...
const myJSFunction = o => input => ...
其中o
是string: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,以至于无法了解泛型。
谢谢
答案 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并喜欢泛型的方式。