Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 某些实用程序函数的泛型类型_Javascript_Typescript_Functional Programming_Javascript Objects - Fatal编程技术网

Javascript 某些实用程序函数的泛型类型

Javascript 某些实用程序函数的泛型类型,javascript,typescript,functional-programming,javascript-objects,Javascript,Typescript,Functional Programming,Javascript Objects,我有一些实用程序函数,我想在typescript中添加泛型类型,但不知道如何做 (这些都是基于ramda的功能,但我不想在这个项目中使用ramda。) 选择: 功能拾取(关键点、对象){ const result=Object.assign( {}, …keys.map(k=>(对象中的k?{[k]:对象[k]}:{})) ); 返回结果; } 拒绝: 功能拒绝(键、对象){ const result=Object.assign( {}, …对象。键(对象) .filter(k=>!keys.

我有一些实用程序函数,我想在typescript中添加泛型类型,但不知道如何做

(这些都是基于ramda的功能,但我不想在这个项目中使用ramda。)

选择:

功能拾取(关键点、对象){
const result=Object.assign(
{},
…keys.map(k=>(对象中的k?{[k]:对象[k]}:{}))
);
返回结果;
}
拒绝:

功能拒绝(键、对象){
const result=Object.assign(
{},
…对象。键(对象)
.filter(k=>!keys.includes(k))
.map(k=>({[k]:对象[k]}))
);
返回结果;
}
}
。。。我希望像这样使用它们,并让typescript计算出结果类型:


类型项={title:string,description:string}
常量测试:{[key:string]:Item}={
答:{标题:'TitleA',描述:'DescriptionA'},
b:{title:'TitleB',description:'DescriptionB'},
c:{title:'TitleC',description:'DescriptionC'},
d:{title:'TitleD',description:'description'}
};
const test1=pick(['a','c'],test)/{a:{title:'TitleA',description:'DescriptionA'},c:{title:'TitleC',description:'DescriptionC'}
const test2=拒绝(['a','c'],test)/{b:{title:'TitleB',description:'DescriptionB'},d:{title:'TitleD',description:'DescriptionD'}
有人对如何在这些
pick
reject
函数中添加泛型类型有什么建议吗


可以使用两个常规类型参数,一个用于对象本身,另一个用于拾取的关键点。然后,可以将类型边界添加到关键帧,使其成为对象关键帧的子集。然后,返回类型是在对象上查找的键的映射类型:

 function pick<O, K extends keyof O>(keys: K[], object: O): { [T in K]: O[T] }

哇,谢谢。这是一种魔力。。我要试着去理解它是如何工作的。但是,现在拒绝函数上有一个ts错误:'string'类型的
参数不能分配给'K'类型的参数“字符串”可分配给“K”类型的约束,但“K”可以用约束“string | number | symbol”的不同子类型实例化。
。与
键相关。includes()
部分。是的,您需要在那里进行类型转换。@juliusbangert pick的快速解释:O是您要从中拾取的对象的类型。K扩展O的键的子集。T是映射到O[T](该键处的对象值)的K的成员(即对象的键之一)。拒绝使用相同的设置。
 function reject<O, K extends keyof O>(keys: K[], object: O): { [T in keyof O]: T extends K ? undefined : O[T] }