blu*_*ere 6 typescript typescript-typings
如同:
我正在寻找一个通用对象,该对象接收任意键的映射以查找值,并返回具有键入值的相同键(如键入的 _.mapValues)。
从对象获取单一类型属性的能力已被记录并且有效。对于数组,您需要将重载硬编码为类型化元组,但对于对象,我收到“重复字符串索引签名”错误。
export interface IPerson {
age: number;
name: string;
}
const person: IPerson = {
age: 1,
name: ""
}
function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
return o[name];
}
const a = getProperty(person, 'age');
// a: number
const n = getProperty(person, 'name');
// n: string
function getProperties<T, K extends keyof T>(obj: T, keys: { [key: string]: K }) {
const def: { [key: string]: T[K] } = {};
return Object.entries(keys).reduce((result, [key, value]: [string, K]) => {
result[key] = getProperty(obj, value);
return result;
}, def);
}
const { a2, n2 } = getProperties(person, {
a2: 'name',
n2: 'age'
});
// Result:
// {
// a2: string | number,
// n2: string | number
// }
// What I'm looking for:
// {
// a2: string,
// n2: number'
// }
Run Code Online (Sandbox Code Playgroud)
如何用打字稿实现这一点?
可能有一种方法可以稍微优化/折叠这种打字,但我有一个函数原型,getProperties我相信它可以实现您正在寻找的东西。
keys您的定义中缺少的是强大的返回类型定义,该定义链接对象中的特定键与对象中的特定类型之间的关联obj。因为缺少这一点,所以一切都变成了类型的联合,这就是您在上面看到的行为。
我想出的函数类型是:
function getProperties
<T, K extends keyof T, U extends { [name: string]: K }>
(obj: T, keys: U):
{[V in keyof U]: T[U[V]];
Run Code Online (Sandbox Code Playgroud)
这里重要的部分是返回值类型:{[V in keyof U]: T[U[V]]}
它指定对于对象V中的每个键keys:
V将是输出对象中的键
值类型将是来自 input 的类型,其中该类型来自与 key inobj关联的值给出的键。VU