Javascript 如何向特定函数添加复杂类型
我正在尝试向该函数添加类型Javascript 如何向特定函数添加复杂类型,javascript,typescript,typescript-typings,Javascript,Typescript,Typescript Typings,我正在尝试向该函数添加类型 function getNewObjectFromKeys(source, keys) { return keys.reduce((acum, value) => { if(typeof source[value] !== 'undefined') { return { ...acum, [value]: sou
function getNewObjectFromKeys(source, keys) {
return keys.reduce((acum, value) => {
if(typeof source[value] !== 'undefined') {
return {
...acum,
[value]: source[value]
}
}
return acum;
}, {});
}
此函数仅从参数source
返回新对象,并从参数keys
返回指定键
我在尝试这样的事情
function getObjectWithKeys<K extends object, T extends keyof K>(source: K, keys: T[]): Pick<K, typeof keys[number]> {
return keys.reduce((acum, value) => {
if(typeof source[value] !== 'undefined') {
return {
...acum,
[value]: source[value]
}
}
return acum;
}, {}) as Pick<K, typeof keys[number]>;
}
函数getObjectWithKeys(源代码:K,键:T[]):Pick{
返回键。减少((acum,值)=>{
如果(源的类型[值]!=='未定义'){
返回{
…阿库姆,
[值]:源[值]
}
}
回归acum;
},{})作为选择;
}
但是,作为Pick的并不能让我信服,这个打字策略可以改进吗
我无法在reduce
方法中将类型作为泛型参数传递。有什么帮助吗?谢谢 typeof key[number]
与您的T
类型完全相同,因此您可以将其替换为:
as Pick<K, T>;
结果结果
被键入为
const result: Pick<{
foo: string;
bar: string;
}, "foo">
这看起来不错,只是您忘记了包含未定义值的筛选器。T extensed keyof K
保证键在对象中。如果不是,TS将不允许调用getObjectWithKeys
。如果K有一些可选字段,这些字段可以在源代码中省略,但包含在键中,因为它们仍然是源代码类型的键,对吗?感谢@CertainPerformance的回答,您知道是否有可能将正确的返回类型添加到此函数中,并将该删除为Pick
?因为使用操作符as
我们告诉编译器类似于“相信我,我知道我在做什么。”并且我不知道是否有一种“方法”可以以更自动化的方式获得正确的返回类型,而不必使用操作符as
,可能这种情况超出了typescript编译器的范围,唯一的解决方案是将操作符用作
。谢谢
const result: Pick<{
foo: string;
bar: string;
}, "foo">
keys.map(
key => [key, source[key]]
)
.filter(
[, value] => value !== undefined
)