我正在尝试使用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中不可能?
答案 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);