使用模块扩充删除先前的声明

时间:2019-07-30 09:22:52

标签: typescript

我想重载react-navigation的{​​{3}}函数以进行更好的类型检查。

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')不是类型错误。

如何才能“删除”以前的声明,只保留我的声明?

1 个答案:

答案 0 :(得分:0)

您仍然会遇到其他重载,因为TypeScript对所有环境模块声明执行了declaration merging。我真的不知道从另一种定义的模块扩充中减去特定模块类型成员(此处为函数重载)的方法。

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

type Routes = 'Dashboard' | 'Profile'

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

type Routes = 'Dashboard' | 'Profile'是仅针对您的应用的特定于域的限制。模块增强/环境模块声明更适合于提供/修复缺少的/错误的或过于广泛的软件包类型(然后最好向所有者要求修复)。

更新

使用tsconfig paths删除了我的建议,因为它在示例中对我来说效果不佳。我也认为,以上解决方案对于您的用例而言,是最佳的维护方式,也是最简单的。希望有帮助。