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}