无法在TypeScript中设置Interface的属性

时间:2013-12-20 06:32:39

标签: javascript typescript

我创建了一个简单的界面

module Modules.Part
{ 
     export interface IPart 
     {
         PartId: number;
         partNumber: string;
         description: string;
     }
}

然后我在另一个接口

中声明了这个接口
module Interfaces.Scopes {
    export interface IPartScope extends ng.IScope {
        part: Modules.Part.IPart;
        vm: Controllers.PartCtrl;
    }
}

我在班上使用这个界面

module Controllers
{
    export class PartCtrl
    {


        constructor(public scope:Interfaces.Scopes.IPartScope)
        {
            scope.part.PartId = 1;
            scope.part.partNumber = "123part";
            scope.part.description = "description";           

        }

    }
}

当我要在我的班级设置IPart界面的属性时,它会给我以下错误

TypeError: Cannot set property 'PartId' of undefined 

请让我知道如何解决这个问题

2 个答案:

答案 0 :(得分:0)

我要说,首先需要初始化part属性的PartCtrl.scope属性(通过构造函数隐式定义):

constructor(public scope:Interfaces.Scopes.IPartScope)
{
  scope.part = [initializer];

  scope.part.PartId = 1;
  scope.part.partNumber = "123part";
  scope.part.description = "description";           
}

由于scope.part是接口类型IPart,因此您无法创建它的实例,而是必须以某种方式解析它。例如:

export interface IActivator<T> {
  new (): T;
}

export class PartCtrl<TPart extends IPart>
{
  constructor(public scope:Interfaces.Scopes.IPartScope, 
              activator: IActivator<TPart>)
  {
    scope.part = new activator();

    // ...
  }
}

现在您可以通过以下方式使用PartCtrl<TPart>

export class ConcretePart implements IPart
{
  public PartId: number;
  public partNumber: string;
  public description: string;
}

var ctrl = new PartCtrl(ConcretePart);

希望这有帮助。

答案 1 :(得分:0)

您可以使用匿名对象初始化属性“part”。

scope.part =
{
   PartId = 1;
   partNumber = "123part";
   description = "description"; 
}

当然,您也可以定义一个实现IPart并实例化它的类。