首页 > 解决方案 > 在 Typescript 中使用外部抽象类而不扩展它

问题描述

我有一个模块被称为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()。也许我混淆了其他编程语言的例程,并在这里混淆了静态抽象的用法......

标签: typescriptooptypescript-typings

解决方案


您不想Utils实现IUtils,因为Utils是类的实例类型。看起来您希望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成为一个班级。如果您永远不想看到Utilslike的实例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
  }
}

或者一个模块,或者什么。


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


推荐阅读