Typescript:如何将通用dict类型传递给类,以便允许将空对象设置为默认值?

时间:2019-03-13 16:56:21

标签: typescript

我希望我的实体将某些组件存储在字典中,如下例所示。但我希望components创建时传递Entity字典的形状。

    entity: {
      id: 1,
      components: {
        position: {
          x: 0,
          y: 0
        },
        mass : {
          value: 4
        },
        color: {
          value: 'green'
        }
      }
    }

不幸的是,Typescript不允许我将components的初始值设置为空对象{}。我收到错误Type {} is not assignable to 'ComponentDictType'.

class Entity<ComponentDictType> {
	public id: number
	public components: ComponentDictType = {}
}

如何约束ComponentDictType,以便它可以分配给空对象?

1 个答案:

答案 0 :(得分:1)

唯一可以将空对象分配给SharedState的方法是,如果components的类型与空对象兼容。一种实现方法是让components保留为完全非可选类型,但将ComponentDictType用作Partial<ComponentDictType>属性的类型:

components

(请注意,我同时初始化了这两个属性。建议同时使用--strictNullChecks--strictPropertyInitialization来捕获class Entity<ComponentDictType> { public id: number = 0; // init here too public components: Partial<ComponentDictType> = {}; // no error } 错误,然后再运行。)

现在您可以使用您的类,但是要警告编译器不再认为undefined的每个属性都必须存在...您必须检查它:

components

希望有所帮助;祝你好运!