首页 > 解决方案 > 使用模块扩充删除先前的声明

问题描述

我想重载 的navigate功能react-navigation以进行更好的类型检查。

navigate(
  routeNameOrOptions: string,
  params?: NavigationParams,
  action?: NavigationAction,
): boolean

我这样定义我的重载:

type Routes = 'Dashboard' | 'Profile'

declare module 'react-navigation' {
  export interface NavigationScreenProp<S, P = NavigationParams> {
    navigate(
      routeNameOrOptions: Routes,
      params?: NavigationParams,
      action?: NavigationAction,
    ): boolean
  }
}

它可以工作,但string类型仍然可用,因此navigate('Invalid')不是类型错误。

我怎样才能“删除”以前的声明只拥有我的?

标签: typescript

解决方案


您仍然会得到其他重载,因为 TypeScript 会合并所有环境模块声明。我真的不知道有什么方法可以从另一个定义的模块扩充中减去特定的模块类型成员(这里是函数重载)。

老实说,最简单的选择是将外部类型包装NavigationScreenProp为特定于路由器层左右的自定义类型。

type Routes = 'Dashboard' | 'Profile'

type Router = {
  navigate(
      routeNameOrOptions: Routes,
      params?: NavigationParams,
      action?: NavigationAction,
  ): boolean
}

type Routes = 'Dashboard' | 'Profile'是针对您的应用的特定域限制。模块扩充/环境模块声明更适合提供/修复丢失/错误或过于宽泛的包类型(然后最好连接所有者进行修复)。

更新

使用 tsconfig 删除了我的建议paths,因为它在示例中对我来说效果不佳。我还认为,上述解决方案对于您的用例来说是最好的维护和最简单的。希望能帮助到你。


推荐阅读