From 1a3e664e43c0d7cf6a9bdead3adcee88cf278945 Mon Sep 17 00:00:00 2001 From: Ivan Demchenko Date: Fri, 1 Dec 2023 15:42:49 +0100 Subject: [PATCH] feat: strict types for form events --- src/ReactEvent.res | 27 ++++++++++++++++++++++++++- src/ReactEvent.resi | 6 +++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/ReactEvent.res b/src/ReactEvent.res index 2d927a1..9905cb4 100644 --- a/src/ReactEvent.res +++ b/src/ReactEvent.res @@ -25,6 +25,31 @@ module MakeEventWithType = ( @send external persist: Type.t => unit = "persist" } +module MakeEventWithTypeStrict = ( + Type: { + type t + }, +) => { + @get external bubbles: Type.t => bool = "bubbles" + @get external cancelable: Type.t => bool = "cancelable" + @get + external currentTarget: Type.t => Js.Json.t = "currentTarget" /* Should return Dom.eventTarget */ + @get external defaultPrevented: Type.t => bool = "defaultPrevented" + @get external eventPhase: Type.t => int = "eventPhase" + @get external isTrusted: Type.t => bool = "isTrusted" + @get external nativeEvent: Type.t => Js.Json.t = "nativeEvent" /* Should return Dom.event */ + @send external preventDefault: Type.t => unit = "preventDefault" + @send + external isDefaultPrevented: Type.t => bool = "isDefaultPrevented" + @send external stopPropagation: Type.t => unit = "stopPropagation" + @send + external isPropagationStopped: Type.t => bool = "isPropagationStopped" + @get external target: Type.t => Js.Json.t = "target" /* Should return Dom.eventTarget */ + @get external timeStamp: Type.t => float = "timeStamp" + @get external type_: Type.t => string = "type" + @send external persist: Type.t => unit = "persist" +} + module Synthetic = { type tag = JsxEvent.Synthetic.tag type t = synthetic @@ -109,7 +134,7 @@ module Focus = { module Form = { type tag = JsxEvent.Form.tag type t = synthetic - include MakeEventWithType({ + include MakeEventWithTypeStrict({ type t = t }) } diff --git a/src/ReactEvent.resi b/src/ReactEvent.resi index 61b5d4b..e40d61d 100644 --- a/src/ReactEvent.resi +++ b/src/ReactEvent.resi @@ -171,16 +171,16 @@ module Form: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Js.Json.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => Js.Json.t = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Js.Json.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist"