如何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作为键和any
types作为值的字段。
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' };