通用接口

与类一样,接口也可以接收多态参数(也称为泛型)。

在接口上声明通用参数

interface IStatus<U> {
    code: U;
}

interface IEvents<T> {
    list: T[];
    emit(event: T): void;
    getAll(): T[];
}

在这里,你可以看到我们两个接口需要一些通用的参数,TU

实现通用接口

我们将创建一个简单的类,以实现 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 方法。

如你所见,通用接口对于静态类型代码非常有用。