Specifying onClick event type with Typescript and React.Konva

后端 未结 5 630
借酒劲吻你
借酒劲吻你 2021-02-04 23:02

I\'m trying to get rid of my tslint error Type declaration of \'any\' loses type-safety. but I\'m struggling to figure out what the correct type would be for the Ev

相关标签:
5条回答
  • 2021-02-04 23:44

    You're probably out of luck without some hack-y workarounds

    You could try

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

    I'm not sure how strict your linter is - that might shut it up just a little bit

    I played around with it for a bit, and couldn't figure it out, but you can also look into writing your own augmented definitions: https://www.typescriptlang.org/docs/handbook/declaration-merging.html

    edit: please use the implementation in this reply it is the proper way to solve this issue (and also upvote him, while you're at it).

    0 讨论(0)
  • 2021-02-04 23:48

    As posted in my update above, a potential solution would be to use Declaration Merging as suggested by @Tyler-sebastion. I was able to define two additional interfaces and add the index property on the EventTarget in this way.

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

    I then can declare the event as KonvaMouseEvent in my onclick MouseEventHandler function.

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

    I'm still not 100% if this is the best approach as it feels a bit Kludgy and overly verbose just to get past the tslint error.

    0 讨论(0)
  • 2021-02-04 23:50

    React.MouseEvent works for me:

    private onClick = (e: React.MouseEvent<HTMLInputElement>) => {
      let button = e.target as HTMLInputElement;
    }
    
    0 讨论(0)
  • 2021-02-04 23:53

    You should be using event.currentTarget. React is mirroring the difference between currentTarget (element the event is attached to) and target (the element the event is currently happening on). Since this is a mouse event, type-wise the two could be different, even if it doesn't make sense for a click.

    https://github.com/facebook/react/issues/5733 https://developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget

    0 讨论(0)
  • 2021-02-04 23:54

    Taken from the ReactKonvaCore.d.ts file:

    onClick?(evt: Konva.KonvaEventObject<MouseEvent>): void;
    

    So, I'd say your event type is Konva.KonvaEventObject<MouseEvent>

    0 讨论(0)
提交回复
热议问题