Typescript 返回具有相同属性名的类型

Typescript 返回具有相同属性名的类型,typescript,generics,Typescript,Generics,我希望函数返回一个与泛型类型参数类型具有相同属性名称的类型 我试过: function getObjectInfo<T>(obj: T): { [key: keyof T]: any; } { const info = {}; Object.getOwnPropertyNames(obj).forEach(propertyName => { info[propertyName] = { /* some info object */ };

我希望函数返回一个与泛型类型参数类型具有相同属性名称的类型

我试过:

function getObjectInfo<T>(obj: T): { [key: keyof T]: any; }  {
    const info = {};
    Object.getOwnPropertyNames(obj).forEach(propertyName => {
        info[propertyName] = { /* some info object */ };
    });
    return info;
}
函数getObjectInfo(obj:T):{[key:keyof T]:any;}{ const info={}; Object.getOwnPropertyNames(obj.forEach)(propertyName=>{ info[propertyName]={/*某些信息对象*/}; }); 退货信息; } 及

函数getObjectInfo(obj:T):{[key:K]:any;}{ const info={}; Object.getOwnPropertyNames(obj.forEach)(propertyName=>{ info[propertyName]={/*某些信息对象*/}; }); 退货信息; } 但是得到以下错误

索引签名参数类型不能是联合类型。请考虑使用映射对象类型。

更新:

还尝试:

function getObjectInfo<T extends { [key: string]: any }, K extends keyof T>(obj: T): { [key: K]: any; }  {
    const info = {};
    Object.getOwnPropertyNames(obj).forEach(propertyName => {
        info[propertyName] = { /* some info object */ };
    });
    return info;
}
函数getObjectInfo(obj:T):{[key:K]:any;}{ const info={}; Object.getOwnPropertyNames(obj.forEach)(propertyName=>{ info[propertyName]={/*某些信息对象*/}; }); 退货信息; }

所以K不是一个联合类型,但仍然会得到同样的错误

,正如错误所说的,您可以考虑使用映射对象来实现这一点。映射对象将使用语法
[key-in-keyof-T]
而不是
[key:keyof-T]
,并将这些键映射到您指定的任何类型(在您的情况下为
any

下面是您的代码片段的外观。唯一的变化是返回类型:

function getObjectInfo<T>(obj: T): { [key in keyof T]: any; } {
    const info = {};
    Object.getOwnPropertyNames(obj).forEach(propertyName => {
        info[propertyName] = { /* some info object */ };
    });
    return info;
}

const x = getObjectInfo({foo: "bar"}); // x has type {foo: any}
函数getObjectInfo(obj:T):{[key-in-keyof-T]:any;}{ const info={}; Object.getOwnPropertyNames(obj.forEach)(propertyName=>{ info[propertyName]={/*某些信息对象*/}; }); 退货信息; } const x=getObjectInfo({foo:bar});//x具有类型{foo:any}
此外,您可以使用内置的
记录
类型作为解决此问题的另一个解决方案。
记录
类型接受两个通用参数。第一个是表示记录键的字符串联合,第二个是它们映射到的类型。因此,上面的返回类型也可以替换为
Record
,以获得相同的结果。

Awesome我不知道“考虑使用映射对象来实现这一点”是什么意思,我想这应该是问题所在。
function getObjectInfo<T>(obj: T): { [key in keyof T]: any; } {
    const info = {};
    Object.getOwnPropertyNames(obj).forEach(propertyName => {
        info[propertyName] = { /* some info object */ };
    });
    return info;
}

const x = getObjectInfo({foo: "bar"}); // x has type {foo: any}