输入getValues + map操作

时间:2019-08-16 08:02:24

标签: typescript typescript-typings

我正在尝试使用TypeScript打字来描述“字典” /对象上的映射操作:

鉴于我有以下对象:

let object = {
  a: "Hello",
  b: 1
}

我通过一个采用每个键值对并将其包装为Wrapped<T>类型的方法传递给它:

let newObject = Wrap(object);

所以我描述它的最好方法是,我希望newObject具有以下等效类型:

interface NewObject {
    a: Wrapped<string>,
    b: Wrapped<number>
}

我尝试了不同的方法,但是我总是以any类型或a类型和b类型的Wrapped<unknown>类型结束

有人知道是否可以描述此操作?还是在TypeScript中不可能?

1 个答案:

答案 0 :(得分:1)

您可以将这样的界面与in keyof结合使用(称为Mapped Types

type WrappedObject<T> = {
    [K in keyof T]: Wrapped<T[K]>;
}

通过一个完整的示例:


const object = {
    a: "Hello",
    b: 1
};

type Wrapped<T> = { value: T };
const _wrap = <T>(value: T) => ({ value });


type WrappedObject<T> = {
    [K in keyof T]: Wrapped<T[K]>;
}

const Wrap = <T extends Object>(obj: T): WrappedObject<T> => {

    const builder: Partial<WrappedObject<T>> = {};

    for (const k in obj) {
        if (obj.hasOwnProperty(k)) {
            builder[k] = _wrap(obj[k]);
        }
    }

    return builder as WrappedObject<T>;
};

let newObject = Wrap(object);
console.log(newObject.a.value);