反応ネイティブプロジェクト(expo)でTypeScriptを使用しています。
このプロジェクトは反応ナビゲーションを使用しているため、画面上でnavigationOptions
を設定でき、prop navigation
にアクセスできます。
現在、これらを強く入力しようとしているので、設定可能なプロパティのヒントが得られます。
interface NavStateParams {
someValue: string
}
interface Props extends NavigationScreenProps<NavStateParams> {
color: string
}
class Screen extends React.Component<Props, any> {
// This works fine
static navigationOptions: NavigationStackScreenOptions = {
title: 'ScreenTitle'
}
// Does not work
static navigationOptions: NavigationStackScreenOptions = ({navigation, screenProps }) => ({
title: navigation.state.params.someValue
})
}
コンポーネントの小道具として反応ナビゲーションを処理する最良の方法は何でしょうか。
次のように、PropにNavigationTypeを追加するだけです。
import { StackNavigator, NavigationScreenProp } from 'react-navigation';
export interface HomeScreenProps {
navigation: NavigationScreenProp<any,any>
};
export class HomeScreen extends React.Component<HomeScreenProps, object> {
render() {
return (
<View style={styles.container}>
<Button
title="Go to Details"
onPress={() => this.props.navigation.navigate('Details')}
/>
</View>
);
}
}
これは動作します:
static navigationOptions = ({ navigation }: NavigationScreenProps) => ({
...
})
yarn add --dev @types/jest @types/react-navigation
import { NavigationScreenProps } from "react-navigation";
export interface ISignInProps extends NavigationScreenProps<{}> { userStore: IUserStore }
export class SignInScreen extends React.Component { .... }
私は同じ問題を抱えており、これが私の解決策です:
import * as React from 'react'
import { NavigationScreenProps, NavigationStackScreenOptions } from 'react-navigation'
interface NavStateParams {
someValue: string
}
// tslint:disable-next-line:no-any
type NavigationOptionsFn<TParams=any> = (props: NavigationScreenProps<TParams>) => NavigationStackScreenOptions
class Screen extends React.Component {
// This should works fine
static navigationOptions: NavigationOptionsFn<NavStateParams> = ({ navigation, screenProps }) => ({
title: navigation.state.params.someValue
})
}
NavigationOptionsFn<TParams>
型をいくつかのd.ts
ファイルに宣言して、グローバルに機能させることができます。
public static navigationOptions: NavigationScreenConfig<NavigationStackScreenOptions> =
({navigation}) => ({/* Your options... */})
すべての ナビゲーション関数 (例:ナビゲート)を手動で記述するのではなく、PropsのインターフェイスでNavigationScreenProp
を直接拡張できます。
私の場合、eslintがエラーを生成しないようにする必要がありました。
import { StackNavigator, NavigationScreenProp } from 'react-navigation';
export interface HomeScreenProps extends NavigationScreenProp {
/* your custom props here */
};
export class HomeScreen extends React.Component<HomeScreenProps, object> {
render() {
return (
<View style={styles.container}>
<Button
title="Go to Details"
onPress={() => this.props.navigation.navigate('Details')}
/>
</View>
);
}
}
NavigationScreenProps
を拡張しているときにこの問題がまだ発生している場合は、自分の小道具とともにnavigationOptions
などを正しく入力できます。
interface Props extends NavigationScreenProps {
someProp: string;
anotherProp: string;
}
export const SomeGreatScreen: NavigationScreenComponent<NavigationParams, {}, Props> = ({
someProp,
anotherProp,
}) => {
...
};
一方、NavigationScreenComponent<Props>
は、非構造化プロパティの型エラーになりました{ someProp, anotherProp }
、小道具の拡張子を認識しない、NavigationScreenComponent<NavigationParams, {}, Props>
した。これは、3番目のパラメーターとして拡張小道具タイプを送信する必要があるためと思われます。
export type NavigationScreenComponent<
Params = NavigationParams,
Options = {},
Props = {}
> = React.ComponentType<NavigationScreenProps<Params, Options> & Props> & {
navigationOptions?: NavigationScreenConfig<Options>;
};
does not work
セクションにtsconfig.json
は"strictNullChecks": true
。この場合、実際にはエラーが発生します。なぜなら、
navigation.state.params.someValue
params
はオプションです。あなたができることは、値が内部で渡されたかどうかを確認し、そうでない場合はデフォルト値を提供することです:
title: navigation.state.params && navigation.state.params.someValue || 'Default title'
これはうまくいくようです:
public static navigationOptions: NavigationScreenOptionsGetter<
NavigationScreenOptions
> = (navigation, stateProps) => ({
title: navigation.state.params.someValue,
});