Вы не хотите, чтобы Utils
реализовывал IUtils
, поскольку Utils
является типом instance класса. Похоже, вы хотите, чтобы конструктор Utils
(тип typeof Utils
) реализовал IUtils
. То есть вы хотите, чтобы toUri
был статическим методом класса Utils
. Как это:
abstract class Utils {
public static toUri = (route: string) => {
return route
}
}
Нет способа аннотировать объявление class Utils
о том, что статическая сторона класса реализует IUtils
. К счастью, конструктор Utils
автоматически будет восприниматься как нечто, реализующее IUtils
без необходимости писать implements IUtils
в любом месте. Спасибо, структурный набор :
declare function takeIUtils(iUtils: IUtils): void;
takeIUtils(Utils); // works anyway
Это должно позволить вашему классу Router
вести себя как нужно.
Примечание, интересно, действительно ли вы хотите, чтобы Utils
был классом вообще. Если вы никогда не хотите видеть экземпляр Utils
, например class X extends Utils {...}; new X()
, то вы, вероятно, делаете жизнь излишне тяжелой для себя. Может быть, это должно быть значение :
export const Utils : IUtils = {
toUri(route: string) {
return route
}
}
Или namespace
:
export namespace Utils {
export function toUri(route: string) {
return route
}
}
Или модуль, или что-то.
В любом случае, надеюсь, это поможет. Удачи!