TS2551:TS:2339向现有对象(TypeScript)动态添加键/值时出现问题

TS2551:TS:2339向现有对象(TypeScript)动态添加键/值时出现问题,typescript,Typescript,我有一个类,它创建一些类的新实例,并将它们的by键附加到this.data属性。它只通过超类的构造函数进行 但是如果我想使用超类的dynamicaddotata方法添加到this.data,那么TypeScript会告诉我这个属性不存在 我想泛型可以解决我的问题,但可能不使用泛型 declare type SuperClassData<M> = { [K in keyof M]: M[K] } declare type SuperClassConstructorObject&l

我有一个类,它创建一些类的新实例,并将它们的by键附加到
this.data
属性。它只通过
超类的构造函数进行

但是如果我想使用
超类
dynamicaddotata
方法添加到
this.data
,那么TypeScript会告诉我这个属性不存在

我想泛型可以解决我的问题,但可能不使用泛型

declare type SuperClassData<M> = {
  [K in keyof M]: M[K]
}

declare type SuperClassConstructorObject<M> = {
  [K in keyof M]: (new () => M[K])
}

class SuperClass<MP> {
  public data: SuperClassData<MP> = {} as SuperClassData<MP>

  constructor (obj: SuperClassConstructorObject<MP>) {
    for (const key of Object.keys(obj)) {
      const Class = obj[key]
      this.data[key] = new Class()
    }
  }

  public dynamicAddToData (key: string, Class: any): void {
    this.data[key] = new Class()
  }
}

class Foo {
  public foo = () => 'foo'
}

class Bar {
  public bar = () => 'bar'
}

const superClass = new SuperClass({ foo: Foo, bar: Bar })

superClass.dynamicAddToData('baz', Bar)

superClass.data.bar.bar() // bar
superClass.data.baz.bar()
声明类型超类数据={
[K in keyof M]:M[K]
}
声明类型超类构造函数对象={
[K in keyof M]:(新的()=>M[K])
}
类超类{
公共数据:超类数据={}作为超类数据
构造函数(对象:超类构造函数对象){
for(对象的常量键。键(obj)){
常量类=对象[key]
this.data[key]=新类()
}
}
公共dynamicAddToData(键:string,类:any):void{
this.data[key]=新类()
}
}
福班{
公共foo=()=>“foo”
}
分类栏{
公共酒吧=()=>“酒吧”
}
const超类=新超类({foo:foo,bar:bar})
超类.dynamicAddToData('baz',Bar)
superClass.data.bar.bar()//bar
超类.data.baz.bar()
类型“SuperClassData”上不存在属性“baz”。ts(2339)


我很高兴每个答案

我不认为这是可能的,如果你用一个json对象初始化了超类对象,那么这个对象上的键是你唯一可以访问的键。keyof是TS的一个很好的补充,它允许非常快速地枚举类型键,并像这样组合。您可以在编译时以编程方式限制数据,以确保您的对象是安全的,并且不能拥有您选择的任何值。。如果您没有keyof,您应该能够完成此操作,因为您的“data”属性只是一个标准字典/对象,其密钥将是您指定为“key”的任何内容@Sohan感谢您的回答,我将继续尝试使用
keyof
解决此问题。希望能对我有所帮助。谢谢当然,如果你得到什么,请告诉我们。如果你对我的评论感到满意,请投赞成票。