Hildebrandt Tobias
04/30/2025, 9:06 AMUpdater
which is defined like this:
sealed external interface Updater<T> /* T | ((old: T) -> T) */
inline fun <T> Updater(
source: T,
): Updater<T> =
unsafeSpecialCast(source)
inline fun <T> Updater(
noinline source: (old: T) -> T,
): Updater<T> =
unsafeSpecialCast(source)
I know I can create these using functionalUpdate()
but how do I consume them?
Currently I do
this.onSortingChange = { newSorting ->
setSorting(newSorting.unsafeCast<SortingState>())
}
but it feels kind of wrong.
What is correct way to consume such an Updater
?Erik van Velzen
04/30/2025, 9:42 AMthis.onSortingChange = Updater<SortingState> { newSorting ->
setSorting(newSorting)
}
Does this work?Hildebrandt Tobias
04/30/2025, 9:44 AMHildebrandt Tobias
04/30/2025, 9:48 AMHildebrandt Tobias
04/30/2025, 11:28 AMuseReactTable<T>(
options = jso {
val (pagination, setPagination) = states.pagination // StateInstance<PaginationState>
this.state = jso<TableState> {
this.pagination = pagination
}
this.onPaginationChange = unsafeSpecialCast(setPagination)
}
)
turansky
04/30/2025, 12:01 PMUpdater
in factturansky
04/30/2025, 12:05 PMunsafeCast
or asDynamic
:
1. Probably you need it without reason, please check one more time
2. It can be typization error in wrappers (current case)turansky
04/30/2025, 12:05 PMHildebrandt Tobias
04/30/2025, 12:07 PMturansky
04/30/2025, 12:07 PMHildebrandt Tobias
04/30/2025, 12:07 PMHildebrandt Tobias
04/30/2025, 12:15 PMturansky
05/01/2025, 8:47 AM2025.5.0
😎Hildebrandt Tobias
06/26/2025, 8:53 PMOnChangeFn
works. (Thanks again!)
But I wonder how I handle these "double types" in general. They do come up often.
For example the Updater
from onPaginationChange
in TanStackTable can be (T) -> T
or just T
.
I found isExternalObject(a, b)
but it's internal so I can't use it.
I could also do
jsTypeOf(updater) == "function")
but is this really the intended way?Hildebrandt Tobias
06/26/2025, 10:07 PMonPaginationChange = OnChangeFn { updaterOrValue: Updater<PaginationState> ->
val newValue: PaginationState = if (jsTypeOf(updaterOrValue) == "function") {
val fn = updaterOrValue.unsafeCast<(PaginationState) -> PaginationState>()
fn(pagination)
} else {
updaterOrValue.unsafeCast<PaginationState>()
}
println("New value: ${JSON.stringify(newValue)}")
},
turansky
06/27/2025, 12:04 PMturansky
06/27/2025, 12:05 PMHildebrandt Tobias
06/27/2025, 1:26 PMtypeCheckUtils
?
There seem to be some really nice tools for edge cases like JsEqEqEq
.turansky
06/27/2025, 1:30 PMI don't quite understand.
Is there such an adapter in the react wrappers?In
kotlin-tanstack-react-table
turansky
06/27/2025, 1:31 PMAlso is there a way to access the?typeCheckUtils
There seem to be some really nice tools for edge cases likeIs there any links with examples?.JsEqEqEq
Hildebrandt Tobias
06/27/2025, 1:32 PMkotlin-tanstack-react-table
isn't that this here, what I already use?:turansky
06/27/2025, 1:33 PMHildebrandt Tobias
06/27/2025, 1:35 PMonSortingChange = OnChangeFn(setSorting),
onGroupingChange = OnChangeFn(setGrouping),
onColumnVisibilityChange = OnChangeFn(setColumnVisibility),
onGlobalFilterChange = OnChangeFn(setGlobalFilter),
onColumnFiltersChange = OnChangeFn(setColumnFilters),
And it works fine, no problems. But it doesn't let me do what I want in the onSomething function.
What if I don't want to just pass a StateSetter? What if I want to do something beforehand?
Or manipulate the value?Hildebrandt Tobias
06/27/2025, 1:37 PMonPaginationChange
is passing a StateSetter.
Isn't it actually a setPaginationStateInstance
instead? And not "do something when pagination changes".