打字稿无法识别多态类

时间:2019-04-02 06:39:34

标签: typescript polymorphism

我有一个这样定义的类:

public class SearchDishes extends AppCompatActivity implements SearchView.OnQueryTextListener{
    List<DetailsofAd> productList;
    RecyclerView recyclerView;

   android.support.v7.widget.Toolbar toolbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_dishes);
        toolbar=(android.support.v7.widget.Toolbar) findViewById(R.id.toolBar);
        setSupportActionBar(toolbar);
        recyclerView = (RecyclerView) findViewById(R.id.recylcermain);
        empty=(TextView) findViewById(R.id.empty);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        productList = new ArrayList<>();   }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.action_bar,menu);
        MenuItem menuItem=menu.findItem(R.id.search);
        android.support.v7.widget.SearchView searchView=(android.support.v7.widget.SearchView)menuItem.getActionView();
        return true;
    }
   @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        newText=newText.toLowerCase();
        ArrayList<DetailsofAd> newList=new ArrayList<>();
        for (DetailsofAd detailsofAd : newList)
        {
            String title=detailsofAd.getTitle().toLowerCase();
            if (title.contains(newText))
            {
                newList.add(detailsofAd);
            }
        }
        AdlistAdapter adapter = new AdlistAdapter(SearchDishes.this, newList);
        adapter.setFilter(newList);

        return false;
    }

我有一个抽象类

export class Layer
{
    public raster: BaseRaster;

    constructor(raster: BaseRaster)
    {
       this.raster = raster;
    }  
}

我有多个栅格类:即

export abstract class BaseRaster
{
    public doBasicStuff(): void { ... }
}

当我这样做

export class ValueRaster extends BaseRaster
{
   public doMoreStuff(): void { ... }
}

export class ZoneRaster extends BaseRaster
{
   public doMoreStuff(): void { ... }
}

layer.raster将为BaseRaster类型-其他语言无法正常工作。

我遇到的问题是layer.raster.doMoreStuff()不是BaseRaster的一部分,因此失败了。

我求助于类型检查:

let valueRaster = new ValueRaster();
let layer = new Layer(valueRaster);

layer.raster.doMoreStuff(); // fails!

有效,但麻烦。

我可以使多态性在Typescript中正常工作吗?也就是说,如果我要在Java / C ++ / C#中执行相同的操作,则调用layer.raster.doMoreStuff()会起作用,因为在构造Layer时它会保留类类型(奇怪的是Typescript知道构造函数名称,但不保留类)。

2 个答案:

答案 0 :(得分:2)

对于您想要的东西感到困惑,如果您想要某种类型的BaseRaster的超集,那么您可以像这样使用通用约束来键入它……

这篇文章中缺少一些类,因此我为这个示例创建了一些假类。

class BaseRaster {
  baseRasterMethod() {
    return "hello"
  }
}

class BaseClass extends BaseRaster {}

export class Layer<T extends BaseRaster> {
    public raster: T;

    constructor(raster: T)
    {
       this.raster = raster;
    }

}

export class ValueRaster extends BaseClass
{
   public newFunction() {
     return "newFunction"
  }
}

let valueRaster = new ValueRaster();
let layer = new Layer(valueRaster);
layer.raster.newFunction // works.

答案 1 :(得分:0)

结果证明我在声明BaseRaster时犯了一个错误。这是正确的代码:

export abstract class BaseRaster
{
    public doBasicStuff(): void { ... }

    abstract public doMoreStuff(): void;
}

layer.raster.doMoreStuff(); // works!