Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有私有变量的TypeScript类声明错误_Javascript_Typescript_Visual Studio Code - Fatal编程技术网

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

Javascript 带有私有变量的TypeScript类声明错误,javascript,typescript,visual-studio-code,Javascript,Typescript,Visual Studio Code,如果我有这样一个TypeScript类声明: export class myClass { constructor(public aVariable: number) {} private aPrivateVariable: number; } const someVar: myClass[] = [ new myClass(3), new myClass(2), ] 然后尝试使用以下命令对其进行初始化: let someVar: myClass[] = [{ a

如果我有这样一个TypeScript类声明:

export class myClass {
  constructor(public aVariable: number) {}
  private aPrivateVariable: number;
}
const someVar: myClass[] = [
    new myClass(3),
    new myClass(2),
]
然后尝试使用以下命令对其进行初始化:

let someVar: myClass[] = [{
  aVariable: 3
}, {
  aVariable: 2
}];
我得到一个错误(至少在VS代码中)说:

类型“{aVariable:number;}”中缺少属性“aPrivateVariable”

为什么我不能这样做


谢谢。

假设您的类也有一个使用此字段的方法:

 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
 }];

假设您的类还有一个使用此字段的方法:

 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
 }];

你忘了申报班级。你可以这样做

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

你忘了申报班级。你可以这样做

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

类型
{aVariable:number;}
myClass

作为国家

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

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

interface IMyClass {
  aVariable: number;
}

export class myClass implements IMyClass {...}

let someVar: IMyClass[] = [{
  aVariable: 3
}];
然后尝试初始化它

应该注意,上面的代码没有初始化类。目前还不清楚分配普通对象而不是类实例的原因是什么,但是如果
someVar
应该包含
myClass
的实例,则type error表示存在问题。应使用
new
显式实例化实例:

let someVar: myClass[] = [new myClass(3)];

类型
{aVariable:number;}
myClass

作为国家

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

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

interface IMyClass {
  aVariable: number;
}

export class myClass implements IMyClass {...}

let someVar: IMyClass[] = [{
  aVariable: 3
}];
然后尝试初始化它

应该注意,上面的代码没有初始化类。目前还不清楚分配普通对象而不是类实例的原因是什么,但是如果
someVar
应该包含
myClass
的实例,则type error表示存在问题。应使用
new
显式实例化实例:

let someVar: myClass[] = [new myClass(3)];

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

:

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

处理这个问题的一种方法是使用
map()


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

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


让someVar:myClass[]=[]作为myClass[]


但是要小心这种方法,因为它不能保证数组中包含的内容与类的模型匹配。

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

:

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

处理这个问题的一种方法是使用
map()


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

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


让someVar:myClass[]=[]作为myClass[]


但要小心这种方法,因为它不能保证数组中包含的内容与类的模型匹配。

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

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

let someVar: myClass = new myClass(3);

初始化此cla的正确方法