如何dynamic地分配属性到TypeScript中的对象?

如果我想以编程方式将属性分配给Javascript中的对象,我会这样做:

var obj = {}; obj.prop = "value"; 

但在TypeScript中,这会产生一个错误:

属性“prop”不存在于types“{}”的值上

我应该如何将任何新属性分配给TypeScript中的对象?

可以将obj表示为any ,但是这打破了使用打字机的全部目的。 obj = {}意味着obj是一个Object 。 标记为any意义都没有意义。 为了实现所需的一致性,可以如下定义接口。

 interface LooseObject { [key: string]: any } var obj: LooseObject = {}; 

或者使其紧凑:

 var obj: {[k: string]: any} = {}; 

LooseObject可以接受任何string作为键和anytypes作为值的字段。

 obj.prop = "value"; obj.prop2 = 88; 

这个解决scheme真正的优雅是你可以在界面中包含types安全字段。

 interface MyType { typesafeProp1?: number, requiredProp1: string, [key: string]: any } var obj: MyType ; obj = { requiredProp1: "foo"}; // valid obj = {} // error. 'requiredProp1' is missing obj.typesafeProp1 = "bar" // error. typesafeProp1 should be a number obj.prop = "value"; obj.prop2 = 88; 

或一气呵成:

  var obj:any = {} obj.prop = 5; 

我倾向于把any另一边,即var foo:IFoo = <any>{}; 所以像这样的东西仍然是types安全的:

 interface IFoo{ bar:string; baz:string; boo:string; } // How I tend to intialize var foo:IFoo = <any>{}; foo.bar = "asdf"; foo.baz = "boo"; foo.boo = "boo"; // the following is an error, // so you haven't lost type safety foo.bar = 123; 

或者,您可以将这些属性标记为可选:

 interface IFoo{ bar?:string; baz?:string; boo?:string; } // Now your simple initialization works var foo:IFoo = {}; 

在线试用

虽然编译器抱怨它仍然应该输出它,如你所需。 但是,这将工作。

 var s = {}; s['prop'] = true; 

当您的对象具有特定types时,此解决scheme很有用。 就像在向其他来源获取对象时一样。

 let user: User = new User(); (user as any).otherProperty = 'hello'; //user did not lose its type here. 

还有一个select是作为一个集合来访问这个属性:

 var obj = {}; obj['prop'] = "value"; 

最好的做法是使用安全打字,我build议你:

 interface customObject extends MyObject { newProp: string; newProp2: number; } 

为了保证types是一个Object (即键值对 ),使用:

 const obj: {[x: string]: any} = {} obj.prop = 'cool beans' 

为了保留以前的types,临时将对象转换为任何types

  var obj = {} (<any>obj).prop = 5; 

新的dynamic属性只有在使用cast时才可用:

  var a = obj.prop; ==> Will generate a compiler error var b = (<any>obj).prop; ==> Will assign 5 to b with no error; 

您可以添加此声明来使警告消失。

declare var obj: any;

将任何types的对象通过types转换为“any”来存储任何新的属性:

 var extend = <any>myObject; extend.NewProperty = anotherObject; 

稍后,您可以通过将您的扩展对象强制转换回“any”来检索它:

 var extendedObject = <any>myObject; var anotherObject = <AnotherObjectType>extendedObject.NewProperty; 

dynamic地将属性分配给TypeScript中的对象。

要做到这一点你只需要使用typecript接口,如下所示:

 interface IValue { prop1: string; prop2: string; } interface IType { [code: string]: IValue; } 

你可以像这样使用它

 var obj: IType = {}; obj['code1'] = { prop1: 'prop 1 value', prop2: 'prop 2 value' };