javascript - 在 react 选择事件处理程序上进行严格设置时出现 TypeScript 编译错误

标签 javascript arrays reactjs typescript react-select

我正在使用 TypeScript 编写一个 React 组件,并在 tsconfig.json 中使用 strict: true

package.json中给出以下内容:

"devDependencies": {
    "@babel/cli": "^7.0.0-rc.1",
    "@babel/core": "^7.0.0-rc.1",
    "@babel/plugin-proposal-class-properties": "^7.0.0-rc.1",
    "@babel/preset-env": "^7.0.0-rc.1",
    "@babel/preset-react": "^7.0.0-rc.1",
    "ajv": "^6.5.2",
    "awesome-typescript-loader": "^5.2.0",
    "babel-loader": "^8.0.0-beta.4",
    "css-loader": "^1.0.0",
    "html-webpack-plugin": "^3.2.0",
    "less": "^3.8.0",
    "less-loader": "^4.1.0",
    "react": "^16.4.2",
    "react-dom": "^16.4.2",
    "reactstrap": "^6.3.1",
    "source-map-loader": "^0.2.3",
    "style-loader": "^0.21.0",
    "typescript": "^3.1.1",
    "webpack": "^4.16.4",
    "webpack-command": "^0.4.1"
  },
  "dependencies": {
    "@fortawesome/fontawesome-svg-core": "^1.2.0-14",
    "@fortawesome/free-solid-svg-icons": "^5.1.0-11",
    "@fortawesome/react-fontawesome": "0.1.0-11",
    "@types/react": "^16.4.14",
    "@types/react-dom": "^16.0.8",
    "@types/react-select": "^2.0.4",
    "@types/reactstrap": "^6.4.0",
    "bootstrap": "^4.1.3",
    "immutable": "^4.0.0-rc.9",
    "npm": "^6.4.1",
    "react-compound-slider": "^0.15.0",
    "react-select": "^2.0.0",
    "rxjs": "^6.2.2"
  }

我发现 react-select 的事件处理程序存在错误,该错误仅出现在 strict 模式下。

这是react-select组件:

<Select options={options}
        isMulti={true}
        onChange={this.props.handler(this.props.name)} />

Prop 中的处理函数经过柯里化(Currying)处理并具有以下形状:

handler: (s: string) => (o: Array<Option>) => void

其中 Option 是行人容器。

export interface Option {
    value: string
    label: string
}

编译错误是这样的:

TS2322: Type '(o: Option[]) => void' is not assignable to type '(value:
              ValueType<Option>, action: ActionMeta) => void'.

正如我之前提到的,在我采取严格之前没有任何问题。

您能解释一下这里的问题是什么以及如何解决它吗?

最佳答案

正如您在错误消息中看到的,第一个参数是 react-select传递给您的处理程序的类型为 ValueType<Option> ;如果你看看 ValueType 的定义和OptionsType ,您会看到它扩展到 Option | Option[] | null | undefined 。当您启用strictFunctionTypes时(这是 strict 的一部分),您的处理函数需要接受 react-select 传递的类型或父类(super class)型(更通用的类型)。特别是,您的处理函数必须接受 Option以及 Option[] 。如果您另外启用strictNullChecks (这也是 strict 的一部分),那么您的处理函数还必须处理 nullundefined .

没有strictFunctionTypes ,处理程序可以接受 ValueType<Option> 的子类型,尽管这是不合理的,因为 react-select可以向处理程序传递一个它无法处理的参数。请参阅this handbook page了解更多信息。

关于javascript - 在 react 选择事件处理程序上进行严格设置时出现 TypeScript 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52572815/

相关文章:

c - C语言中如何处理指针数组?

javascript - 找不到模块 : Error: Can't resolve 'date-fns/addDays' in 'C:\Users\

javascript - JQuery 将行添加到表并将事件仅绑定(bind)到最后一项

javascript - 在单击时移动 Sprite 直到其被单击

javascript - 如何使body元素的宽度拉伸(stretch)到html的宽度?

ios - 随机生成的数组仅适用于按钮

arrays - 查找总和为 0 的数组的所有子集

javascript - React object.map 由于 key 而未更新

reactjs - 如何在新行中设置自动完成的占位符?

javascript - 从 sencha 数据存储检索数据时出现奇怪的情况