Is it possible to do something like this in TypeScript?
If not, is there a formal explanation as to why the compiler can't infer nested type parameters?
Here's an example of what I'm trying to achieve:
interface TestFilter {
name?: string;
}
interface FilterComponent<F> {
setFilter(filter: F)
}
class TestFilterComponent implements FilterComponent<TestFilter> {
private filter: TestFilter;
setFilter(filter: TestFilter) {
this.filter = filter;
}
}
// Can I use F without declaring it as another type parameter?
// Something like: class FilterWrapperComponent<FC extends FilterComponent<F>>
abstract class FilterWrapperComponent<F, FC extends FilterComponent<F>> {
private sidebarFilter: FC;
private modalFilter: FC;
public passFilter(filter: F) {
this.sidebarFilter.setFilter(filter);
this.modalFilter.setFilter(filter);
}
}
// I want to just write "extends FilterWrapperComponent<TestFilterComponent>"
// and get TestFilter as F automatically
class TestFilterWrapperComponent extends FilterWrapperComponent<TestFilter, TestFilterComponent> {
}
Also available on playground.
TestFilterComponentis notFilterComponent<TestFilter>, it just implements it but it's separate class/interface.