React Navigation 타입스크립트 사용하기
React Native는 이제 타입스크립트를 사용하는 것이 기본 옵션이 되었다.
그에 따라서, 나 역시 타입스크립트를 사용하는데 react navigation의 타입스크립트 설정이 유난히 번거로웠다.
그래서 다음번의 번거로움을 줄이고자, 내가 사용해본 react navigation의 타입스크립트 설정을 기록으로 남겨두기로 했다.
🍖 코드들은 stack navigator를 기준으로 설명한다.
import {createNativeStackNavigator} from '@react-navigation/native-stack';
import {Setting, Home, Login} from "./components";
export type RootStackParamList = {
Login: undefined;
Home: {
setName: () => void;
};
Setting: {
name: string;
};
};
const Stack = createNativeStackNavigator<RootStackParamList>();
function LoginRoutes() {
return (
<Stack.Navigator
initialRouteName="Login"
screenOptions={{
headerShown: false,
}}>
<Stack.Screen name="Login" component={Login} />
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="Setting" component={Setting} />
</Stack.Navigator>
);
}
export default LoginRoutes;
일단, 가장 먼저 네비게이터 생성자에 제네릭으로 각 페이지와 그에 해당되는 props에 대한 타입을 설정한다.
타입스크립트 설정을 하면, navigation에서 이동할 수 있는 스크린의 자동완성이 지원되므로 편하다.
만약 navigate가 되면서 props를 건네 받는 스크린이라면, 위의 Home이나 Setting과 같이 해당 props에 대한 타입을 설정할 수 있다.
import type {NativeStackScreenProps} from '@react-navigation/native-stack';
export type LoginHomeProps = NativeStackScreenProps<
RootStackParamList,
'Login'
>;
function Login({navigation, route}: LoginProps) {
...
}
각 스크린은 props로 navigation과 route를 갖는다.
이에 대한 타입스크립트 설정은 위와 같이 할 수 있다.
네비게이터를 생성할 때 사용했던 RootStackParamList가 재사용되어 navigation.navigate나 route.params 등 내부에 값들에 대한 자동완성이 지원된다.
import {useNavigation, useRoute, RouteProp} from '@react-navigation/native';
import type {NativeStackNavigationProp} from '@react-navigation/native-stack';
export type HomeNavigationProps = NativeStackNavigationProp<
RootStackParamList,
'Home'
>;
type HomeRouteProps = {
Home: {setName: () => void};
};
function Home() {
const navigation = useNavigation<HomeNavigationProps>();
const route = useRoute<RouteProp<HomeRouteProps, 'Home'>>();
...
}
useRoute나 useNavigation을 사용하며 타입스크립트를 적용할 땐 위와 같이 설정할 수 있다.
위에서는 stack navigation에 대해서만 다뤘지만.
만약 예를들어 BottomTabNavigation을 사용한다면,
import type {BottomTabNavigationProp} from '@react-navigation/bottom-tabs';
와 같이 앞의 네비게이터 이름만 변형해서 유사하게 코드를 작성할 수 있다.
https://reactnavigation.org/docs/typescript/
https://reactnavigation.org/docs/typescript/
reactnavigation.org