如何从对象创建映射类型?如果我尝试以下操作:
interface Stats {
count: number,
avg: number
}
class Blah<T> {
private stats: { [K in keyof T]: Stats };
constructor(foo: T) {
this.stats = Object
.keys(foo)
.reduce((result, key) => Object.assign(result, {
[key]: { count: 0, avg: 1 }
}), {});
}
}
...我得到错误:
类型“{}”不可分配给类型“{ [K in keyof T]: Stats; }'
这似乎是因为 is 中的初始值reduce
与接口不匹配。
我可以将我的声明更改为一种解决方法:
private stats: { [K in keyof T]?: Stats };
...但是现在这意味着 keyof T 的某些值可能根据类型未定义。
鉴于无法在 JavaScript 中创建没有中间结果的映射对象,您如何创建一个完全映射的类型?