当前位置: 首页 > 知识库问答 >
问题:

带有约束的类型脚本泛型不能分配给泛型接口

宓毅庵
2023-03-14

我在TypeScript 2.4中遇到一个错误。2在泛型类上,该泛型类的约束与不太严格的接口不兼容。我得到以下错误:

TS/组件/Schedule.ts(37,13):错误TS2322:键入{人周末视图: PlanItemschduleView; project...属性“人员周末视图”与索引签名不兼容。类型PlanItemschduleView不能分配给类型IPlanItemschduleView。属性'onAddedItem'的类型不兼容。类型(项目:T,首字母:布尔值)=

ts/views/PlanItemScheduleView。ts(2,18):错误TS2420:类“PlanItemScheduleView”未正确实现接口“IPlanItemScheduleView”。属性“onAddedItem”的类型不兼容。类型“(项目:T,首字母:布尔)=

ts/view/PlanItemschduleView.ts(99,79):错误TS2345:类型this的参数不能分配给类型IControlllerListener的参数。类型PlanItemschduleView不能分配给类型IControlllerListener。属性'onAddedItem'的类型不兼容。类型(项目:T,首字母:布尔值)=

接口

namespace Planning {
    export interface IPlanItemScheduleView extends IView, IControllerListener<IPlanItem> {
        setTimespan(timespan: Timespan): void;
        getName(): string;
    }
}
namespace Planning {
    export interface IControllerListener<T> {
    /**
     * Notifies the listener that an item is added to the cache so it can add it to its view.
     * 
     * @template T
     * @param {T} item
     * @param {boolean} initial
     * 
     * @memberOf IControllerListener
     */
    onAddedItem<T>(item: T, initial: boolean): void;
    }
}

namespace Planning {
    export class PlanItemScheduleView<T extends PlanItem> implements IPlanItemScheduleView {

        public onAddedItem<T extends PlanItem>(item: T, initial: boolean): void {
            // implementation that needs properties on PlanItem
        }
    }
}

PlanItem是一个抽象基类,由一些实际实现继承。我有几种不同的氛围,我是这样构建的:

  // Create the different views
  this._views = {
            personWeekView: new PlanItemScheduleView<Person>(this._options, this._logger, this),
            projectWeekView: new PlanItemScheduleView<Project>(this._options, this._logger, this),
            resourceWeekView: new PlanItemScheduleView<Resource>(this._options, this._logger, this),
        };

我以为我以前在tsc的另一个版本中进行过编译,但我可能弄错了。我怎样才能解决这个问题?

共有1个答案

余天宇
2023-03-14

您不需要onAddedItem上的泛型参数,如果您希望onAddedItem采用与类相同的参数类型,您可以使用class参数。您可以使IPlanItemschduleView泛型,以便将PlanItemschduleView类型参数向下传递到IControlllerListener

export interface IControllerListener<T> {
  onAddedItem(item: T, initial: boolean): void;
}
export interface IPlanItemScheduleView<T extends IPlanItem>  extends IControllerListener <T> {

}
export class PlanItemScheduleView<T extends PlanItem> implements IPlanItemScheduleView<T> {
  public onAddedItem(item: T, initial: boolean): void {
      // implementation that needs properties on PlanItem
  }
}

注:编辑以考虑反馈。

 类似资料:
  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 我在typescript中有以下泛型类 但是我不知道为什么得到这个错误Class'(匿名类)'不正确地扩展基类'列'。属性getValue的类型不兼容。类型'(值:数字)=

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 在过去一周左右的时间里,我一直在为Scala开发一个类型化、索引化的数组特性。我希望将该特征作为类型类提供,并允许库用户以他们喜欢的方式实现它。下面是一个示例,使用列表的列表来实现2D数组类型类: 这一切看起来都很好。我遇到的困难是,我希望将索引类型约束为一个已批准类型的列表(用户可以更改)。由于程序不是所有已批准类型的原始所有者,所以我想用一个typeclass来表示这些已批准类型,并让已批准类

  • 我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数A必须扩展参数B,其中A和B都是泛型的。 下面是我的示例 用法示例如下 一些封闭的班级 和函数调用 我不想在抽象类声明中定义E,因为T已经在那里定义了。 我也试着做了以下几点: 将myList定义为接受扩展T的键 将E定义为T类型(无法找到如何指定它在函数中扩展T 但它从来都不起作用。有没有办法做到这一点?我在Sta