如何在 Typescript 中定义 React Navigation navigationOptions 参数

Posted

技术标签:

【中文标题】如何在 Typescript 中定义 React Navigation navigationOptions 参数【英文标题】:How to define React Navigation navigationOptions parameter in Typescript 【发布时间】:2018-10-24 05:42:20 【问题描述】:

在使用 React Navigation 的 React Native 应用程序中,我有一个屏幕组件,我想根据给定的参数使用 navigationOptions 属性在其中定义 title,如下所示:

static navigationOptions = (navigation) => (
    title: navigation.state.params.myParam
);

它工作正常,并且标题打印正确。 但是,现在我正在将应用程序迁移到 Typescript,并且我想将 myParam 定义为必需的字符串,但我不知道如何定义参数,所以我在我的 IDE 中获得了自动完成功能:

(navigation: /* WhatDoIPutHere? */)

我在this Gist 中尝试了这种方法,但正如我在那里评论自己的那样,这对我来说效果不佳......

我可以用什么类型来定义预期的参数?

【问题讨论】:

【参考方案1】:

实际上我从问题中链接的the Gist 中的解决方案几乎是正确的-问题只是navigation.state.params 根据定义可能未定义!所以,Typescript 和我的 IDE(聪明人)都在抱怨它......

你可以从here的定义中看到相关位:

export interface NavigationLeafRoute<Params> 
  // ...
  /**
   * Params passed to this route when navigating to it,
   * e.g. ` car_id: 123 ` in a route that displays a car.
   */
  params?: Params;

所以我最终在我的组件中这样做了:

interface Params 
    myParam: string


// ...

static navigationOptions = (navigation: NavigationScreenProps<Params>) => (
    title: navigation.state.params ? navigation.state.params.myParam : 'Default title'
);

而且它工作得很好,包括我的 IDE 中的自动完成功能——开始非常喜欢 Typescript!

【讨论】:

如果您使用navigation.getParam(),它还提供类型检查。 (您只能使用 Params 界面中的属性键) typescript 确实强迫您编写故障安全代码。【参考方案2】:

我能够通过执行以下操作来使其工作:

import  NavigationScreenProp, NavigationRoute  from 'react-navigation';

interface Params 
  otherId: string;
  otherName: string;
  otherPic: string;
  id: string;


class MessengerContainer extends Component 
  static navigationOptions = ( navigation :  navigation: NavigationScreenProp<NavigationRoute<Params>, Params>) => (

// ... more code here

);

【讨论】:

以上是关于如何在 Typescript 中定义 React Navigation navigationOptions 参数的主要内容,如果未能解决你的问题,请参考以下文章

在react typescript项目中如何使用没有@type定义的npm包

如何使用 Typescript 在 React 中定义 <video> 引用的类型?

如何在没有定义文件的情况下在 Typescript 中使用 JS 库(React-Summernote)

使用 react-apollo,如何使用 TypeScript 在同一个组件中定义 2 个突变?

如何在 TypeScript v2.x 中从自定义 React 组件公开“通用”事件

如何在 Typescript 中将具有动态键的对象设置为 React 状态