Javascript 某些实用程序函数的泛型类型
我有一些实用程序函数,我想在typescript中添加泛型类型,但不知道如何做 (这些都是基于ramda的功能,但我不想在这个项目中使用ramda。) 选择: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.
功能拾取(关键点、对象){
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] }