简体   繁体   中英

Cannot set property of Interface in TypeScript

I have create a simple interface

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

then i have declare this interface in another interface

module Interfaces.Scopes {
    export interface IPartScope extends ng.IScope {
        part: Modules.Part.IPart;
        vm: Controllers.PartCtrl;
    }
}

i have use this interface in my class

module Controllers
{
    export class PartCtrl
    {


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

        }

    }
}

when i am going to set property of IPart interface in my class it's give me following error

TypeError: Cannot set property 'PartId' of undefined 

please let me know how to solve this

I'd say, you first need to initialize the part property of the PartCtrl.scope property (which you implicitly defining through the constructor):

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

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

Since the scope.part is of interface type IPart , you can't create an instance of it but rather have to resolve it somehow. For example:

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();

    // ...
  }
}

Now you can use the PartCtrl<TPart> in the following way:

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

var ctrl = new PartCtrl(ConcretePart);

Hope this helps.

You can initialize the property "part" with an anonymous object.

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

Of course you can also define a class that implements IPart and instantiate it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM