我有一个名为utils.tsx
的模块,以便:
interface IUtils {
toUri: (route: string) => string
}
export default abstract class Utils implements IUtils {
public toUri = (route: string) => {
return route
}
}
和另一个我希望使用该utils模块的文件:
import Utils from '../helpers/utils'
class Router {
private getBuilder = (search: string) => {
const path = Utils.toUri(search)
}
}
当我尝试使用Utils.toUri
时,出现TS错误:
[ts] Property 'toUri' does not exist on type 'typeof Utils'.
我的意图是在不扩展Router
类或从其继承的情况下调用外部抽象类函数(因为在主文件中我将有多个外部模块)。
有人可以帮助我绕过它并理解吗?
PS:我也尝试过public abstract toUri()
。也许我将其他编程语言的例程混合在一起,并且在这里将 static 的用法与抽象混淆了...
答案 0 :(得分:1)
您不希望Utils
实现IUtils
,因为Utils
是类的 instance 类型。看来您想让Utils
构造函数(类型为typeof Utils
)实现IUtils
。也就是说,您希望toUri
是Utils
类的 static 方法。像这样:
abstract class Utils {
public static toUri = (route: string) => {
return route
}
}
无法对class Utils
声明进行注释,以说该类的静态端实现了IUtils
。幸运的是,Utils
构造函数将自动被视为实现IUtils
的东西,而无需在任何地方编写implements IUtils
。谢谢structural typing:
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
}
}
export namespace Utils {
export function toUri(route: string) {
return route
}
}
或者模块,或者其他东西。
无论如何,希望能有所帮助。祝你好运!