在 TypeScript 中扩展参数化接口的通用接口

Posted

技术标签:

【中文标题】在 TypeScript 中扩展参数化接口的通用接口【英文标题】:Generic interface extending parameterized interface in TypeScript 【发布时间】:2019-06-08 17:36:40 【问题描述】:

我有这样的类型,我在扩展接口时覆盖单一类型:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

interface htmlEvent<T> extends Omit<Event, 'target'> 
    target: T;

现在我想创建一个 EventType 类型,它将接受事件类型,例如 MouseEvent 和目标类型。

我试过了:

interface EventType<E, T> extends Omit<E, 'target'> 
    target: T;


const e: EventType<MouseEvent, HTMLButtonElement>;

但出现错误:

接口只能扩展对象类型或对象的交集 具有静态已知成员的类型。

我认为我需要的是一个可以创建类型的函数。

接口EventType 可以在 TypeScript 中使用吗?是否可以拥有一种泛型类型而无需为每种事件类型指定泛型接口。

【问题讨论】:

【参考方案1】:

这个错误非常清楚地说明了对接口继承的限制。由于类型包含未解析的类型参数,Typescript 不会让你在接口的 extends 子句中使用它。

你可以使用交叉类型来获得类似的效果:

type EventType<E extends Event, T> = Omit<E, 'target'> &  
    target: T;

【讨论】:

以上是关于在 TypeScript 中扩展参数化接口的通用接口的主要内容,如果未能解决你的问题,请参考以下文章

Typescript 扩展通用接口

typescript:扩展多种类型的模板化接口数组

具有通用方法的Typescript接口

TypeScript:相当于 C# 的用于扩展类的通用类型约束?

如何将数据组表示为通用 Typescript 接口

如何在 TypeScript 3+ 中正确键入通用元组剩余参数?