通用接口
与类一样,接口也可以接收多态参数(也称为泛型)。
在接口上声明通用参数
interface IStatus<U> {
code: U;
}
interface IEvents<T> {
list: T[];
emit(event: T): void;
getAll(): T[];
}
在这里,你可以看到我们两个接口需要一些通用的参数,T和 U 。
实现通用接口
我们将创建一个简单的类,以实现 IEvents 接口。
class State<T> implements IEvents<T> {
list: T[];
constructor() {
this.list = [];
}
emit(event: T): void {
this.list.push(event);
}
getAll(): T[] {
return this.list;
}
}
让我们创建一下 State 类的一些实例。
在我们的示例中,State
类将使用 IStatus<T>
处理通用状态。通过这种方式,接口 IEvent<T>
也将处理 IStatus<T>
。
const s = new State<IStatus<number>>();
// The 'code' property is expected to be a number, so:
s.emit({ code: 200 }); // works
s.emit({ code: '500' }); // type error
s.getAll().forEach(event => console.log(event.code));
这里我们的 State
类被命名为 ISatus<number>
。
const s2 = new State<IStatus<Code>>();
//We are able to emit code as the type Code
s2.emit({ code: { message: 'OK', status: 200 } });
s2.getAll().map(event => event.code).forEach(event => {
console.log(event.message);
console.log(event.status);
});
我们的 State
类型为 IStatus<Code>
。通过这种方式,我们可以将更复杂的类型传递给 emit 方法。
如你所见,通用接口对于静态类型代码非常有用。