【问题标题】:Typescript: tabBarOptions from createBottomTabNavigator打字稿:来自 createBottomTabNavigator 的 tabBarOptions
【发布时间】:2020-01-09 18:58:10
【问题描述】:

我正在通过expo init 通过它的第三个选项构建一个 react-native 应用程序,它在 Javascript 中创建基本的导航模板。 最近我正在尝试使用现有模板的 Typescript,并尝试将这些 js 代码转换为 typescript,但无法弄清楚为什么 typescript 在 tabBarOptions 上引发错误。

以下是原始(官方)稍作修改的部分代码,与类型错误无关。代码本身是完全可运行的,并且该模式出现在许多关于如何在createBottomTabNavigator 中正确使用tabBarOptions 的问题中。

这是打字稿错误。

我还从 github 看到了布局组件关系的问题。

https://github.com/react-navigation/tabs/issues/174

据我根据链接了解,该错误不会出现。我是打字稿的新手,所以如果我误解了任何概念,请不要评判我。

【问题讨论】:

    标签: typescript react-native react-navigation expo


    【解决方案1】:

    错误的症结在于 typescript 指出 fontWeight 的属性类型不兼容的那一行。

    react-navigation-tabs 库仅接受有限数量的可能 fontWeight 值。您提供了正确的值,但是,Typescript 无法确定 tabConfig 的内容在任何地方都没有发生变化,因此它将 fontWeight 视为字符串。

    有两种方法可以解决这个问题:

    1. 内联移动tabConfig定义:
    createBottomTabNavigator({
       tabConfig: {
          labelStyle: {
             fontWeight: 'bold'
          }
          // and other props...
       }
    })
    
    1. 将 tabConfig 声明为不可变的。这样 Typescript 将正确处理类型
    const tabConfig = {
        labelStyle: {
            fontWeight: 'bold'
        }
        // and other props...
    } as const; //<--- this `as const` operator does the trick
    
    createBottomTabNavigator({ tabConfig })
    

    【讨论】:

    • 非常感谢!您介意详细说明Typescript cannot be sure that the content of tabConfig is not mutated anywhere, so it treats fontWeight as a string. 以及as const 在这种情况下如何工作吗?感谢任何链接,因此我将来可以解决相同的症结,因为我仍然无法阅读打字稿错误。
    • 以及使用as const技巧的任何缺点,所以我不会在任何地方滥用它以防万一。
    • 默认情况下,Javascript 中的对象可以被变异,可以有属性更新。 as const 标记对象是只读的,因此更改属性将是编译错误。 Typescript 无法检测到该对象永远不会更改,因为这是非常昂贵的操作。这个问题包含一些更详细的解释:github.com/microsoft/TypeScript/issues/9998
    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2017-04-18
    • 2020-05-09
    • 2017-05-02
    • 2018-01-18
    • 2015-09-14
    相关资源
    最近更新 更多