Open cssinate opened 1 year ago
You can using NiceModal.show
and pass generic type while calling it. eg:
NiceModal.show<boolean>(someModal).then((res) => {
// res is boolean you passed in
console.log(res);
});
You can using
NiceModal.show
and pass generic type while calling it. eg:NiceModal.show<boolean>(someModal).then((res) => { // res is boolean you passed in console.log(res); });
能在 someModal 里面定义,然后 show 的时候自动推断吗?
Any chance to have types support also for imperative code (using hooks)?
const modal = useModal(MyModal);
...
modal.show<ReturnType>().then(result => {})
This would be very nice! Using the generic type from the .show() function doesn't really help, it's as good as casting my result as [some type] which doesn't have to be in sync with the actual return value. Also I have to look up what types my ModalComponent might return.
I think it should at least be a return type specified in the ModalComponent which is checked against my resolve values and then used by the .show() function.
Something like this:
const ConfirmDialog = NiceModal.create<
{
//input
title: string
},
//output
boolean
>(({ title }) => {
const modal = useModal()
...
// would error if resolve value is not typeof boolean
modal.resolve(true)
...
})
// confirmResult is typeof boolean (specified from the output of ConfirmDialog)
const confirmResult = await NiceModal.show(
ConfirmDialog,
{ title: 'Hi' }
)
https://github.com/eBay/nice-modal-react/blob/979c283892c4f16a4a2d5ecf582d1500eca3807a/src/index.tsx#L216
Right now, the
.show()
method always returnsPromise<unknown>
. If I'm not mistaken, whatever I end up passing into.resolve()
is what gets returned to.show()
.I'm only still learning TypeScript, but can't you use generics to accept a type? Right now, I'm having to do a manual type-check method in order to assert my return type. It feels like I shouldn't have to do that.
For example, if when constructing the modal, you do
In the app when you do
TypeScript thinks
res
isunknown
. Surely there's a way I can assert that it's a boolean?