【发布时间】:2020-09-15 00:54:25
【问题描述】:
我的 React Native 应用程序的 Typescript 和 React Navigation 存在问题。
我在我的项目中进行了以下设置,这在使用时为我提供了很棒的帮助和自动完成功能,例如navigation.push().
类型
import { StackNavigationProp } from '@react-navigation/stack';
export type RootStackParamList = {
Home: undefined;
Content: undefined;
List: undefined;
};
export type StackNavigationProps = StackNavigationProp<RootStackParamList>;
用法
const navigation = useNavigation<StackNavigationProps>();
但是,我创建了一个导航处理函数,它接受一个参数,该参数被馈送到navigation.push。只要参数的类型是any,它就可以正常工作。
const navigationHandler = useCallback((targetScreen) => {
navigation.push(targetScreen);
}, [navigation]);
但我对any 类型并不满意,我更希望targetScreen 实际上只是在我的RootStackParamList 类型中声明的屏幕之一。我尝试了无数种方法来满足导航对象的push 方法,但我被卡住了。
以下尝试是最成功的,但尚未完全按照应有的方式工作。它确实让我在可用屏幕上自动完成,但push 仍然不开心。
类型:
export type NavigationScreen<T extends RootStackParamList> = {
[K in keyof T]: K;
}[keyof T];
用法:
const navigationHandler = useCallback(
<T extends RootStackParamList>(targetScreen: NavigationScreen<T>) => {
navigation.push(targetScreen);
},[navigation]);
悬停错误,我收到以下提示:
(参数) targetScreen: { [K in keyof T]: K; }[keyof T] 参数 type '[{ [K in keyof T]: K; }[keyof T]]' 不可分配给 '["Home" | 类型的参数“内容” | "列表"] | [“首页” | “内容” | “列表”,未定义]'。键入 '[{ [K in keyof T]: K; }[keyof T]]' 是 不可分配给类型 '["Home" | “内容” | “列表”]'。
类型 'keyof T' 不可分配给类型 '"Home" | “内容” | “列表”。
键入'字符串 |号码 |符号' 不可分配给类型 '"Home" | “内容” | “列表”。
类型 'string' 不可分配给类型 '"Home" | “内容” | “列表”。
类型“keyof T”不可分配给类型“列表”。
键入'字符串 |号码 |符号'不可分配给类型'“列表”'。
类型“字符串”不可分配给类型“列表”。
如何让它工作?
【问题讨论】:
-
我目前没有很好的环境来重现您的问题,但您最有可能正在寻找的是
targetScreen: keyof RootStackParamList
标签: typescript react-native react-navigation