如果我有这样的TypeScript类声明:
export class myClass {
constructor(public aVariable: number) {}
private aPrivateVariable: number;
}
然后尝试使用以下命令初始化它:
let someVar: myClass[] = [{
aVariable: 3
}, {
aVariable: 2
}];
我收到错误(至少在VS Code中)说:
财产&avrivateVariable'缺少类型' {aVariable:number; }'
为什么我不能这样做?
感谢。
答案 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);