在Typescript中使用外部抽象类而不对其进行扩展

时间:2018-11-09 17:15:23

标签: typescript oop typescript-typings

我有一个名为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 的用法与抽象混淆了...

1 个答案:

答案 0 :(得分:1)

您不希望Utils实现IUtils,因为Utils是类的 instance 类型。看来您想让Utils 构造函数(类型为typeof Utils)实现IUtils。也就是说,您希望toUriUtils类的 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
  }
}

namespace

export namespace Utils {
  export function toUri(route: string) {
    return route
  }
}

或者模块,或者其他东西。


无论如何,希望能有所帮助。祝你好运!