Skip to content
This repository has been archived by the owner on Jan 23, 2024. It is now read-only.

Add Luau types #36

Merged
merged 10 commits into from
Aug 6, 2022
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/createUseBinding.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
local function createUseBinding(roact, useValue)
return function(defaultValue)
return function<T>(defaultValue: T): (any, (newValue: T) -> ())
Kampfkarren marked this conversation as resolved.
Show resolved Hide resolved
return unpack(useValue({
roact.createBinding(defaultValue)
}).value)
Expand Down
5 changes: 4 additions & 1 deletion src/createUseCallback.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
type DependencyList = { unknown }
type Function<Args..., Rets...> = (Args...) -> Rets...

local function createUseCallback(useMemo)
return function(callback, dependencies)
return function<Args..., Rets...>(callback: Function<Args..., Rets...>, dependencies: DependencyList?): Function<Args..., Rets...>
return useMemo(function()
return callback
end, dependencies)
Expand Down
6 changes: 5 additions & 1 deletion src/createUseEffect.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
type Destructor = () -> ()
type EffectCallback = (() -> Destructor) | (() -> ())
type DependencyList = { unknown }

local function createUseEffect(component)
return function(callback, dependsOn)
return function(callback: EffectCallback, dependsOn: DependencyList?)
assert(typeof(callback) == "function", "useEffect callback is not a function")

component.hookCounter += 1
Expand Down
5 changes: 4 additions & 1 deletion src/createUseMemo.lua
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
local dependenciesDifferent = require(script.Parent.dependenciesDifferent)

type DependencyList = { unknown }
type Function<Args..., Rets...> = (Args...) -> Rets...
JohnnyMorganz marked this conversation as resolved.
Show resolved Hide resolved

local function createUseMemo(useValue)
return function(createValue, dependencies)
return function<T...>(createValue: () -> T..., dependencies: DependencyList?): T...
local currentValue = useValue(nil)

local needToRecalculate = dependencies == nil
Expand Down
4 changes: 3 additions & 1 deletion src/createUseReducer.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
type Reducer<S, A> = (state: S, action: A) -> S

local function createUseReducer(useCallback, useState)
return function(reducer, initialState)
return function<S, A>(reducer: Reducer<S, A>, initialState: S): (S, (action: A) -> ())
local state, setState = useState(initialState)
local dispatch = useCallback(function(action)
setState(reducer(state, action))
Expand Down
2 changes: 1 addition & 1 deletion src/createUseState.lua
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ end
local function createUseState(component)
local setValues = {}

return function(defaultValue)
return function<T>(defaultValue: T): (T, (newValue: T) -> ())
JohnnyMorganz marked this conversation as resolved.
Show resolved Hide resolved
component.hookCounter += 1
local hookCount = component.hookCounter
local value = component.state[hookCount]
Expand Down
14 changes: 12 additions & 2 deletions src/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,18 @@ local function createHooks(roact, component)
}
end

function Hooks.new(roact)
return function(render, options)
export type Hooks = typeof(createHooks())
export type HookOptions<Props> = {
name: string?,
defaultProps: { [string]: any }?,
componentType: "Component" | "PureComponent" | nil,
validateProps: ((props: Props) -> (boolean, string?))?,
[string]: { NO_EXTRA_ARGS: never },
}
export type RenderFunction<Props> = (props: Props, hooks: Hooks) -> any

function Hooks.new<Props>(roact)
return function(render: RenderFunction<Props>, options: HookOptions<Props>?)
assert(typeof(render) == "function", "Hooked components must be functions.")

if options == nil then
Expand Down