Learning TypeScript 2.x
上QQ阅读APP看书,第一时间看更新

Multiple types in generic type constraints

We can only refer to one type when declaring a generic type constraint. Let's imagine that we need a generic class to be constrained, so it only allows types that extend the following two interfaces:

    interface Foo { 
        doSomething(): void; 
    } 
 
    interface Bar { 
        doSomethingElse(): void; 
    } 

We may think that we can define the required generic constraint as follows:

class Example1<T extends Foo, Bar> { 
    private prop!: T; 
    public doEverything() { 
        this.prop.doSomething(); 
        this.prop.doSomethingElse(); // error 
    } 
} 

However, this code snippet will throw a compilation error. We cannot specify multiple types when declaring a generic type constraint. However, we can work around this issue by using Foo and Bar in a superinterface:

interface FooBar extends Foo, Bar {} 

Foo and Bar are now superinterfaces because they are the parent interfaces of the FooBar interface. We can then declare the constraint using the new FooBar interface:

class Example2<T extends FooBar> { 
    private prop!: T; 
    public doEverything() { 
        this.prop.doSomething(); 
        this.prop.doSomethingElse(); 
    } 
}