我正试图摆脱我的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)
}}

我曾try 将事件声明为几个不同的类型,比如React.MouseEvent<HTMLElement>,以及HtmleElement上的其他几个子类型,但没有成功作为目标.索引不是我能想到的任何类型的属性.我可以从判断员那里看出,目前的目标是Konva.文本和索引设置为0,但不确定这是否对我有帮助,因为我无法将类型设置为Konva.Text,这对我来说是有意义的,但这也不起作用.

React Konva Event target Index

以下是我的全部功能组件:

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生态系统还很陌生,所以我仍在努力将我的大脑包围在它周围.

更新:

我能够使用泰勒·塞巴斯蒂安的建议来定义目标上的索引,从而使tslint沉默.但我不确定这是不是最好的方法,因为我觉得这有点脆弱.

以下是附加的接口代码和更新的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)
    }}
  />
)

推荐答案

正如我在上面的更新中所发布的,一个潜在的解决方案是使用@Tyler sebastion建议的声明合并.我能够定义两个额外的接口,并以这种方式在EventTarget上添加索引属性.

interface KonvaTextEventTarget extends EventTarget {
  index: number
}

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

然后,我可以在onclick MouseEventHandler函数中将事件声明为KonvaMouseEvent.

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

我仍然不确定这是否是最好的方法,因为仅仅为了克服tslint错误,它感觉有点笨拙和过于冗长.

Typescript相关问答推荐

如何在类型脚本中使用条件陈述循环

您可以创建一个类型来表示打字员吗

无法从应用程序内的库导入组件NX Expo React Native

为什么从数组中删除一个值会删除打字错误?

根据另一个属性的值来推断属性的类型

如何编写一个类型脚本函数,将一个对象映射(转换)为另一个对象并推断返回类型?

在TypeScrip的数组中判断模式类型

使用TypeScrip根据(可选)属性推断结果类型

在类型脚本中的泛型类上扩展的可选参数

为什么在这个例子中,我把缺少的属性添加到对象中时,TypeScrip没有拾取,如何修复?

类型脚本映射类型:从对象和字符串列表到键值对象

如何实现异构数组内函数的类型缩小

如何在NX工作区项目.json中设置类似angular.json的两个项目构建配置?

如何 bootstrap TS编译器为类型化属性`T`推断正确的类型?

自定义 Select 组件的类型问题:使用带逗号的泛型类型<;T与不带逗号的<;T&>;时出错

字符串文字联合的分布式条件类型

在对象数组中设置值

如何使用 Angular 确定给定值是否与应用程序中特定单选按钮的值匹配?

如何通过nx找到所有受影响的项目?

如何在由函数参数推断的记录类型中具有多个对象字段类型