带私有变量的TypeScript类声明错误

时间:2018-05-07 14:32:55

标签: javascript typescript visual-studio-code

如果我有这样的TypeScript类声明:

export class myClass {
  constructor(public aVariable: number) {}
  private aPrivateVariable: number;
}

然后尝试使用以下命令初始化它:

let someVar: myClass[] = [{
  aVariable: 3
}, {
  aVariable: 2
}];

我收到错误(至少在VS Code中)说:

财产&avrivateVariable'缺少类型' {aVariable:number; }'

为什么我不能这样做?

感谢。

6 个答案:

答案 0 :(得分:1)

想象一下,您的类也有一个使用此字段的方法:

 export class myClass {
  constructor(public aVariable: number) {}
  private aPrivateVariable: number;
  test(){  }
 }

现在,如果您要执行以下操作:

 const instance: myClass = {
    aVariable: 1,
    test() {
      alert.aPrivateVariable + 1);
    }
 };

 instance.test();

它会失败。因此,您还需要添加私有属性。

 let someVar: myClass[] = [{
  aVariable: 3,
  aPrivateVariable: 2,
 }, {
  aVariable: 2,
  aPrivateVariable: 3
 }];

答案 1 :(得分:1)

类型{ aVariable: number; }myClass

不兼容

the manual所述,

  

类中的私有成员和受保护成员会影响其兼容性。检查类的实例是否兼容时,如果目标类型包含私有成员,则源类型还必须包含源自同一类的私有成员。同样,这同样适用于具有受保护成员的实例。这允许类与其超类兼容,但不允许使用来自不同继承层次结构的类,否则这些类具有相同的形状。

如果myClass应该用作接口来分配与myClass类结构兼容的普通对象,则应提供单独的接口:

interface IMyClass {
  aVariable: number;
}

export class myClass implements IMyClass {...}

let someVar: IMyClass[] = [{
  aVariable: 3
}];
  

然后尝试初始化

应该注意的是,上面的代码不会初始化类。目前还不清楚分配普通对象而不是类实例的原因是什么,但如果someVar应包含myClass的实例,则类型错误表示问题。应使用new

显式实例化实例
let someVar: myClass[] = [new myClass(3)];

答案 2 :(得分:1)

以您所做的方式({ aVariable: 2})定义对象不会将它们实例化为myClass个对象。这是一个问题,因为aPrivateVariable未被实例化,因为永远不会调用myClass构造函数,并且您添加的对象与myClass包含的对象不匹配。

As this excerpt from the typescript handbook on type compatibility states

  

类中的私有成员和受保护成员会影响其兼容性。检查类的实例是否兼容时,如果目标类型包含私有成员,则源类型还必须包含源自同一类的私有成员。同样,这同样适用于具有受保护成员的实例。这允许类与其超类兼容,但不允许使用来自不同继承层次结构的类,否则这些类具有相同的形状。

解决这个问题的一种方法是使用诸如map()

之类的东西来实例化每个对象

const someVar: myClass[] = [2,3,1].map(num => myClass(num)) ;

或者,如果您对对象的形状有信心,可以使用类型强制:

let someVar: myClass[] = [] as myClass[]

请注意这种方法,因为它不能保证数组中包含的内容与类的模型匹配。

答案 3 :(得分:1)

export class myClass {
   constructor(public aVariable: number) {}
   private aPrivateVariable: number;
}

正确的方法是真正初始化你的课程:

const someVar: myClass[] = [
    new myClass(3),
    new myClass(2),
]

如果您没有初始化课程,那么您希望从myClass获取任何方法,最终会将对象强制转换为myClass

答案 4 :(得分:0)

你忘了宣布上课。你可以这样做

const someVar: myClass[] = [new myClass(3), new myClass(2)];

答案 5 :(得分:0)

初始化此类的正确方法是 -

export class myClass {
  constructor(public aVariable: number) {}
  private aPrivateVariable: number;
}

let someVar: myClass = new myClass(3);