如何使用打字稿中的查找来推断类型化的mapValues?

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)

如何用打字稿实现这一点?

cas*_*ber 3

可能有一种方法可以稍微优化/折叠这种打字,但我有一个函数原型,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

  1. V将是输出对象中的键

  2. 值类型将是来自 input 的类型,其中该类型来自与 key inobj关联的值给出的键。VU