我有一个方法,我想在其中传递一个泛型对象数组。我还想传入要查找的对象属性。
因为属性名称可以更改,所以我想用传入的值来切换描述和值。
我如何做到这一点,如何传入属性并从对象数组中取出它的值?
通过执行以下命令,我知道这些属性是否存在:
console.log(obj[key].hasOwnProperty(strDisplay))
console.log(obj[key].hasOwnProperty(strValue))
public Test<T>(obj: T[], strDisplay: string, strValue: string) {
const pickList: PickListOption[] = [];
Object.keys(obj).forEach(key => {
const option: IPickListOption = {
display:obj[key].description ,
value: obj[key].value
};
pickList.push(option);
})
return pickList;
}
我希望能够返回一个新的列表'pickList‘,其中包含显示和值的键值对。
发布于 2019-07-30 13:24:10
您对数组使用Object.keys
看起来有点不对劲。要将一个数组转换为另一个数组,map
是一个更好的选择。
关于选择这两个键,您将需要strDisplay
和strValue
作为T
的值键,以便对对象进行索引:
interface PickListOption { value: unknown, display: unknown }
function Test<T>(arr: T[], strDisplay: keyof T, strValue: keyof T) {
return arr.map((o): PickListOption => ({
display: o[strDisplay],
value: o[strValue]
}))
}
您还可以使用特殊的映射和条件类型将键限制为特定类型的值:
type KeysOfValueType<T, TValue> = {
[P in keyof T] : T[P] extends TValue ? P: never
}[keyof T]
interface PickListOption { value: number, display: string }
function Test<T>(arr: T[], strDisplay: KeysOfValueType<T, string>, strValue: KeysOfValueType<T, number>) {
return arr.map((o): PickListOption => ({
display: o[strDisplay] as unknown as string,
value: o[strValue] as unknown as number
}));
}
https://stackoverflow.com/questions/57272549
复制相似问题