首页 > 解决方案 > 如何实现具有未知泛型属性的接口?

问题描述

在我们的项目中,我们有一个这样的界面:

export interface InterfaceA {
  closed: EventEmitter<unknown>;
}

然后我们在这样的组件中使用它:

export interface CloseData {
  closeSource: CloseSource;
}
export class ComponentB implements InterfaceA {
  closed = new EventEmitter<CloseData>();
...
}

“CloseSource”是一个枚举。

它工作得很好,除非我们启用“ strictFunctionTypes ”标志(或“ strict ”标志)我们得到这个错误:

错误 TS2416:“ComponentB”类型中的“已关闭”属性不可分配给基类型“InterfaceA”中的相同属性。
类型“EventEmitter”不可分配给类型“EventEmitter”。
属性“观察者”的类型不兼容。
类型 'Observer[]' 不可分配给类型 'Observer[]'。
类型“观察者”不可分配给类型“观察者”。
类型“未知”不可分配给类型“CloseData”。

根据我的发现(例如:https ://stackoverflow.com/a/68711655 ),这是因为函数的逆变换。

首先,我不明白这背后的逻辑。

其次,我们可以做些什么来使它正确?我们不想使用“ any ”,因为我们的代码质量分析工具告诉我们它很糟糕,而且我们不想禁用似乎使我们的代码更安全的标志。

有没有神奇的解决方案?

这是一个示例打字稿语言

解决方案 C 并不完美,因为仍然有一个“任何”,但我认为这是朝着正确方向迈出的一步(我们可以尝试让使用我们的库的人尽可能添加泛型)。有没有办法让代码在没有“任何”且不更改 ComponentC(或 A)类的情况下工作?

标签: typescriptgenericsargumentstypescript-generics

解决方案


推荐阅读