Javascript 带有私有变量的TypeScript类声明错误
如果我有这样一个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
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的正确方法