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

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

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

属性“prop”在类型为“{}”的值上不存在

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


当前回答

为Angular扩展@jmvtrinidad解决方案,

当使用已经存在的类型化对象时,这是添加新属性的方法。

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

现在如果你想在html端使用otherProperty,这是你需要的:

<div *ngIf="$any(user).otherProperty">
   ...
   ...
</div>

Angular编译器将$any()视为转换为any类型,就像TypeScript中使用a <any>或任意类型转换一样。

其他回答

我倾向于把任何放在另一边,即var foo:IFoo = <任何>{};所以这样的东西仍然是类型安全的:

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 obj:any = {}
  obj.prop = 5;

您可以添加此声明来屏蔽警告。

declare var obj: any;

为Angular扩展@jmvtrinidad解决方案,

当使用已经存在的类型化对象时,这是添加新属性的方法。

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

现在如果你想在html端使用otherProperty,这是你需要的:

<div *ngIf="$any(user).otherProperty">
   ...
   ...
</div>

Angular编译器将$any()视为转换为any类型,就像TypeScript中使用a <any>或任意类型转换一样。

尽管编译器抱怨它仍然应该按照你的要求输出它。然而,这是可行的。

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