Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.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
Angular TS2611:';foo';定义为类';A';,但在';B';作为存取者_Angular_Typescript - Fatal编程技术网

Angular TS2611:';foo';定义为类';A';,但在';B';作为存取者

Angular TS2611:';foo';定义为类';A';,但在';B';作为存取者,angular,typescript,Angular,Typescript,我在angular应用程序中遇到一个typescript编译错误。下面是示例代码和错误消息。你能指导我抑制这个错误吗。根据Javascript,我认为这段代码是正确的 -错误TS2611:“foo”被定义为类“a”中的属性,但在“B”中被重写为访问器。 这是编程语言中的常见行为,当您从父级继承时,您不能使用相同的变量/函数/访问器名称,除非您指定新名称覆盖旧名称,但始终必须是相同的类型。所以在您的示例中,我们在父对象中有变量,在子对象中有访问器。您可以执行以下更改: A类{ _foo:stri

我在angular应用程序中遇到一个typescript编译错误。下面是示例代码和错误消息。你能指导我抑制这个错误吗。根据Javascript,我认为这段代码是正确的

-错误TS2611:“foo”被定义为类“a”中的属性,但在“B”中被重写为访问器。

这是编程语言中的常见行为,当您从父级继承时,您不能使用相同的变量/函数/访问器名称,除非您指定新名称覆盖旧名称,但始终必须是相同的类型。所以在您的示例中,我们在父对象中有变量,在子对象中有访问器。您可以执行以下更改:

A类{
_foo:string=“”;
set foo(名称){
这个。_foo=名称;
}
getfoo(){
把这个还给我;
}
}
出口类别B扩展了A{
f1:任何;
set foo(名称){
this.f1=名称;
}
getfoo(){
返回此文件。f1;
}
}

我相信有一些方法可以忽略类型限制(如果必须的话),但我不知道如何做,我认为这不是一个好方法(程序应该对读者清晰)。

如果您确实确定您的实现是正确的,那么您可以通过在ts文件顶部放置
/@ts nocheck
行来禁用检查。

错误消息是正确的,因为这里有一个微妙的错误。在父类中定义特性时,会为其每个子类自动创建该特性

因此,在您编写的代码中,如果您不是为类B编写的:
set/get foo(name){…}
该类无论如何都会有
foo
属性,因为该属性是在
B
的父类-
A
中声明的

在您的代码中,您实际上是在使用访问器声明来删除
A
中声明的
foo
属性

如果要要求
A
的所有子类声明其自己的
foo
属性(类似于接口),请尝试:

导出A类{
抽象foo:string;
}

另一种方法是创建一个可用于扩展子类的
抽象类。
我先使用
接口
然后使用
摘要
,然后在最后一个类中使用访问器(get/set)对其进行扩展

界面中
您将定义您的属性。但是,如果要使用访问器(get/set),则需要创建一个
摘要
。我只会在数据类型类上这样做,在这些类中,您可以针对一个类存储和检索数据

下面的例子可以在这里找到

接口iNote{
数量:数量,,
速率:数字|字符串,
总计?:数字|字符串
}
抽象类aquete实现iquete{
抽象集合数量(x:编号);
抽象获取数量():编号;
抽象设定速率(x:数字|字符串);
抽象获取速率():数字|字符串;
抽象集合总数(x:数字|字符串);
抽象get total():数字|字符串
受保护的抽象updateTotal():void
抽象getTotalNum():编号
}
类引用扩展了aqueote{
建造师(目标:iNote){
超级()
此数量=对象数量
本费率=目标费率
}
设置数量(v:编号){
该数量=v;
this.updateTotal()
}
获取数量(){
返回此。_数量;
}
设置速率(v:数字|字符串){
该比率=数量(v);
this.updateTotal()
}
获取速率(){
返回新的Intl.NumberFormat('en-GB'{
风格:“货币”,
货币:英镑
}).格式(编号(此._费率))
}
集合总数(v:数字|字符串){
此项。_总计=数量(v);
}
get total():数字|字符串{
返回新的Intl.NumberFormat('en-GB'{
风格:“货币”,
货币:英镑
}).格式(编号(此._总数))
}
getTotalNum(){
退货编号(本次共)
}
受保护的updateTotal(){
this.total=数量(本单价)*数量(本数量)
}
私人数量:数量=1;
私有|率:数字|字符串=1;
私人|总计?:数字|字符串=(数字(本.|费率)*本.|数量);
}
类QuoteArray扩展数组{
getTotals():编号{
让totalFigure:number=0
this.forEach(o=>{
totalFigure=totalFigure+o.getTotalNum()
});
返回总数
}
}
让arry:QuoteArray=new QuoteArray();
到货推送(新报价)({
数量:2,
费率:5
}))
到货推送(新报价)({
数量:3,
费率:5
}))
到货推送(新报价)({
数量:3,
费率:5
}))
到货推送(新报价)({
数量:3,
费率:5
}))
到货推送(新报价)({
数量:3,
费率:5
}))
控制台日志(arry);
console.log(arry.getTotals())

上面的例子创建了一个引号数组,我可以像数组一样操作它,但我也扩展了数组类型,给我一个名为
getTotals()
的方法,这样它就可以打印出一个格式化的货币。

似乎在ts 4中强制执行:

我同意你的观点,但在我的情况下,类A和类B都位于其中一个第三方库中。其中我无法更改,但我希望忽略此错误。在文件顶部添加了
/@ts nocheck
。现在编译器将忽略该文件。谢谢如果您不想忽略整个文件,您可以在“get foo(){”之前的行中添加//@ts ignore,如果您确实确定您的实现是正确的,请使用javascript…”Typescript给您带来困难?请禁用它不是一个有意义的答案,帮助你没有检查不是真的有用。我认为这应该只是一个临时的解决办法。
export class A {
  foo: string;
}

export class B extends A {
  f1;
  set foo(name) {
    this.f1 = name;
  }
  get foo() {
    return this.f1;
  }
}