typescript - 使用模块扩充删除先前的声明
问题描述
我想重载 的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 会合并所有环境模块声明。我真的不知道有什么方法可以从另一个定义的模块扩充中减去特定的模块类型成员(这里是函数重载)。
老实说,最简单的选择是将外部类型包装NavigationScreenProp
为特定于路由器层左右的自定义类型。
type Routes = 'Dashboard' | 'Profile'
type Router = {
navigate(
routeNameOrOptions: Routes,
params?: NavigationParams,
action?: NavigationAction,
): boolean
}
type Routes = 'Dashboard' | 'Profile'
是针对您的应用的特定域限制。模块扩充/环境模块声明更适合提供/修复丢失/错误或过于宽泛的包类型(然后最好连接所有者进行修复)。
更新:
使用 tsconfig 删除了我的建议paths
,因为它在示例中对我来说效果不佳。我还认为,上述解决方案对于您的用例来说是最好的维护和最简单的。希望能帮助到你。
推荐阅读
- python - 为什么kafka-python消费者轮询总是只返回一条消息?(timeout_ms 行为)
- javascript - 如何允许使用 Javascript 在沙盒 iframe 中下载?
- java - 让 Fragment 首先出现在 LinearLayout 中
- c++ - 线程安全运算符<<
- php - 如何将多个角色添加到路由组 laravel
- python - 未找到模块
- python - 使用 Python 自动化无聊的东西的嵌套列表问题
- python - 创建参数图
- mysql - 在 MySQL 中从 CSV 导入 NULL 值
- java - Java Web 项目,属性文件未正确更新并错过循环中的某些位置