Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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_Typescript Typings - Fatal编程技术网

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
        )