【问题标题】:Strange TS2322 (Type not assignable) Error奇怪的 TS2322(类型不可分配)错误
【发布时间】:2021-06-11 22:59:02
【问题描述】:

我在这里有一个超级简单的代码 sn-p,但无论我使用哪个编辑器(Webstorm、VSCode),我的 SearchBar 的“onChangeText”属性下都会出现红色下划线,并显示以下消息:

TS2322: Type '(val: string) => void' is not assignable to type '((text: string) => void) & ((text: string) => void) & (() => any) & (() => any) & (() => any) & ((text: string) => void) & (() => any) & (() => any) & (() => any)'.   Type '(val: string) => void' is not assignable to type '() => any'.

代码如下:

import React from "react";
import { useState } from "react";
import { StyleSheet, View } from "react-native";
import { SearchBar } from "react-native-elements";
import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view";
import ScreenWrapper from "../styled/ScreenWrapper";

const HomeScreen = (): JSX.Element => {
  const [searchString, setSearchString] = useState("");

  function updateSearch(val:string):void {
      setSearchString(val)
  }

  return (
    <ScreenWrapper>
      <KeyboardAwareScrollView
        contentContainerStyle={styles.container}
        resetScrollToCoords={{ x: 0, y: 0 }}
        scrollEnabled={false}
      >
        <SearchBar
          placeholder="Type here to search tournaments"
          onChangeText={updateSearch}
          value={searchString}
        />
      </KeyboardAwareScrollView>
    </ScreenWrapper>
  );
};

代码似乎编译和执行得很好,但编辑器中的错误让我抓狂。是否有充分的理由显示这一点?

【问题讨论】:

  • 您使用的是哪个编辑器?您是否尝试过升级编辑器正在使用的 ts 库(在 VSCode 中,这将是 "typescript.tsdk" 设置)?我遇到了类似的问题,在 VSCode 中显示错误但编译时没有错误,升级 VSCode 正在使用的 ts lib 解决了它。
  • @j1mbl3s 谢谢你的建议。我尝试更新项目的 TS 版本并确保我的编辑器使用的是相同的版本,但不幸的是错误并没有消失
  • 尝试删除 updateSearch 方法上的 void 返回类型。
  • @Shivam 刚刚尝试过,没有运气:(谢谢你的想法

标签: reactjs typescript react-native


【解决方案1】:

编译器认为您的updateSearch 函数可能在需要() =&gt; any 的上下文中调用,可能是因为在onChangeText 属性上键入。由于您的函数可以在没有任何参数的情况下调用,编译器认为您的函数需要任何参数是错误的。您可以通过将 val 参数设为可选来解决此问题,例如使用合理的默认值:

function updateSearch(val = ""):void {
    setSearchString(val)
}

documentation for that attribute 没有说明它提供的参数,但the code itself 中的输入似乎是正确的。不知道这里的编译器发生了什么。

【讨论】:

  • 这成功了!不幸的是,现在我在同一个元素上遇到了这个新问题。对这个有任何想法吗? TS2740:类型'{占位符:字符串; onChangeText: (val?: string) => void;值:字符串;容器样式:{};自动大写:“无”; }' 缺少来自类型 'Pick & { platform: "default" | 的以下属性“ios” | “安卓”; containerStyle?: StyleProp; ... 12 更多 ...; onCancel?(): 无效; } & ... 6 更多 ... & Partial<...>, "ref" | ... 138 更多... | "round">​​':onBlur、onFocus、loadingProps、平台等 10 个。
  • 呵呵,它要你在&lt;SearchBar&gt; 上设置every 属性。这显然是错误的。首先,我会检查您是否拥有最新版本的react-native-elements,以防这些打字问题已经得到修复。除此之外,根据我的经验,当 TypeScript 不断报告非常不正确的错误时,无论您进行什么更改,它实际上都卡在了其他地方并且非常困惑以至于不知道如何告诉您。仔细检查其他绑定属性,包括&lt;KeyboardAwareScrollView&gt;。然后尝试将其进一步缩小为一个最小的可重现示例。
  • 好主意,非常感谢您的帮助。如果我能找到它,我会更新!
猜你喜欢
  • 2017-04-10
  • 2019-02-07
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
相关资源
最近更新 更多