typescript - 在 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()
。也许我混淆了其他编程语言的例程,并在这里混淆了静态与抽象的用法......
解决方案
您不想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
成为一个班级。如果您永远不想看到Utils
like的实例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
}
}
或者一个模块,或者什么。
无论如何,希望这会有所帮助。祝你好运!
推荐阅读
- tableau-api - 在 ClickHouse 中使用 JOINS 和检查 NULL 的 Tableau 查询失败
- javascript - VueJS:根据查询变量更新数据
- sql - 如何在 PostgreSQL 中通过数组正确创建多个条目?
- arrays - 通过 Int 随机播放结构
- python - 计算由字典组成的给定列表中的城市数量?
- wordpress - 如何修复linkedin随机不显示共享的帖子图片?
- go - fmt.Println 中的可变变量展开
- python - 如何应用于具有多索引列的数据框中的一组列
- android - 使用 Observable.zip 调用多个 API
- swift - 有什么方法可以对数组内的自定义对象进行排序?