reactjs - 使用 Typescript 和 React.Konva 指定 onClick 事件类型

标签 reactjs typescript konvajs

我正试图摆脱我的 tslint 错误 Type declaration of 'any' loses type-safety.但我正在努力找出事件的正确类型。

我正在尝试将 Lynda“Building and Deploying a Full-Stack React Application”转换为 Typescript。

以下是导致问题的具体线路:

onClick={(event: any) => {
 makeMove(ownMark, event.target.index)
}}

我尝试将事件声明为几种不同的类型,例如 React.MouseEvent<HTMLElement> ,加上 HTMLElement 上的一些其他子类型,但没有成功,因为 target.index 不是我能想到的任何类型的属性。我可以从检查器中看到 currentTarget 是 Konva.Text 并且索引设置为 0但不确定这对我有帮助,因为我无法将类型设置为 Konva.Text ,这对我来说很有意义,但这也不起作用。

React Konva Event target Index

这是我完整的 React 功能组件:

export const Squares = ({units, coordinates, gameState, win, gameOver, yourTurn, ownMark, move}: SquaresProps) => {
  let squares = coordinates.map( (position: number, index: number) => { 
    let makeMove = move
    let mark = gameState[index] !== 'z' ? gameState[index] : false
    let fill = 'black'

    // when someone wins you want the square to turn green
    if (win && win.includes(index)) {
      fill = 'lightGreen'
    }

    if (gameOver || !yourTurn || mark) {
      makeMove = () => console.log('nope!')
    }

    return (
      <Text
        key={index}
        x={position[0]}
        y={position[1]}
        fontSize={units}
        width={units}
        text={mark}
        fill={fill}
        fontFamily={'Helvetica'}
        aligh={'center'}
        onClick={(event: any) => {
          makeMove(ownMark, event.target.index)
        }}
      />
    )
  })

  return (
    <Layer>
      {squares}
    </Layer>
  )
}

这是我的 package.json依赖项:

  "dependencies": {
    "konva": "^1.6.3",
    "material-ui": "^0.18.4",
    "react": "^15.6.1",
    "react-dom": "^15.6.1",
    "react-konva": "^1.1.3",
    "react-router": "~3.0.0",
    "react-tap-event-plugin": "^2.0.1",
    "styled-components": "^2.1.0"
  },

认为索引是由 Konva Layer 类添加的,但我对整个 React 生态系统还很陌生,所以我仍在努力思考这一切。

更新:

我能够使用 Tyler Sebastion 的声明合并建议来定义目标上的索引,从而使 tslint 静音。我不确定这是最好的方法,因为它对我来说有点脆弱。

这是额外的接口(interface)代码和更新的 onclick 事件:

interface KonvaTextEventTarget extends EventTarget {
  index: number
}

interface KonvaMouseEvent extends React.MouseEvent<HTMLElement> {
  target: KonvaTextEventTarget
}

...

return (
  <Text
    key={index}
    x={position[0]}
    y={position[1]}
    fontSize={units}
    width={units}
    text={mark}
    fill={fill}
    fontFamily={'Helvetica'}
    aligh={'center'}
    onClick={(event: KonvaMouseEvent) => {
      makeMove(ownMark, event.target.index)
    }}
  />
)

最佳答案

如果没有一些 hack-y 解决方法,您可能会倒霉

你可以试试

onClick={(event: React.MouseEvent<HTMLElement>) => {
 makeMove(ownMark, (event.target as any).index)
}}

我不确定你的 linter 有多严格——这可能会让它闭嘴一点

我玩了一会儿,没弄明白,但你也可以考虑编写自己的扩充定义:https://www.typescriptlang.org/docs/handbook/declaration-merging.html

编辑:请使用 this reply 中的实现这是解决这个问题的正确方法(并且在你这样做的时候也给他投票)。

关于reactjs - 使用 Typescript 和 React.Konva 指定 onClick 事件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45089866/

相关文章:

reactjs - 是否安全地在客户端创建带有 token 的 cookie?

Angular:使用 Typescript 使表单值只读变灰并使数据获取有效

node.js - 我的 typescript 编译器有什么问题? `tsc --version` 什么都不返回

javascript - 销毁 KonvaJS 补间末端的多个形状

jquery - 学习使用 React 但我对如何合并 Promise 感到困惑

javascript - 如何实现一个简单的react多步控制

javascript - 这段带有匿名闭包的 React 代码对 validateFormat 做了什么?

angular - 我如何根据 Angular 条件使用字符串插值

html - 将形状从调色板拖到 Konvajs 舞台上

javascript - 在 Konva JS 中拖动后获取形状的 X 和 Y