我一直试图让 Typescript 推断出动态创建的 getter 和 setter 的类型。我有一堂MyClass带containers地图的课:
type Container = {
get: () => Content
set: (value: Content) => void
}
type ContainersMap = { [key: string]: Container }
class MyClass {
containers: ContainersMap
constructor(names: string[]) {
this.containers = {} as ContainersMap
names.forEach(name => {
Object.defineProperty(this.containers, name, {
get() { return read(name) },
set(value) { write(name, value) }
})
})
Object.freeze(this.containers)
}
}
接下来在我的代码中,我想像这样使用它:
let someContent: Content = {/* some content */}
let myClass = new MyClass(['first', 'second'])
// Getting type error in line below because TS thinks I try assign Content to Container
myClass.containers['first'] = someContent
我发现的一个可能的解决方案是定义type ContainersMap = { [key: string]: Content },但我不喜欢这个解决方案,因为我认为它不能反映实际ContainersMap类型
这是一种正确实施的方法吗?