Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[@wordpress/data] Add types to the useSelect function #37239

Open
wants to merge 3 commits into
base: trunk
Choose a base branch
from

Conversation

dmsnell
Copy link
Member

@dmsnell dmsnell commented Dec 8, 2021

Description

Adds primitive TypeScript types to useSelect. In this PR we're adding
enough type information to useSelect to make it (a) internally consistent,
and (b) marginally useful to callers.

Internal consistency is mostly about introducing types without violations
so that TypeScript can compile the code successfully. While we have introduced
a few type casts in this patch they are either benign or replicate existing risk,
such as in asserting that an error in a catch clause does in fact extend the
Error class/prototype.

Marginally useful is about providing information to callers that ensures type
safety and introduces information to aid in development. In order to keep this PR
small the goals are low here. We don't provide any information about the return
value from calling useSelect other than to indicate that it could be a map of
functions or it could be anything (if provided a mapping function). It does, however,
provide a hint for the mapping function and what arguments it expects.

useSelectMarginalUtility mov

There is much more we should be able to do to let our types flow through the
system and to provide hints on what functions are available after calling select(store)
but for now this makes one small step towards that goal while hopefully not
taking any steps backward away from it.

How has this been tested?

Screenshots

Types of changes

Adds types to useSelect with minimal changes to actual code.
There should be no functional or behavioral changes in this PR,
apart from a couple of small fixes as forced by TypeScript, for
example, in supplying a default value for deps to useCallback
when not supplied by the caller.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@dmsnell dmsnell added [Package] Data /packages/data Developer Experience Ideas about improving block and theme developer experience labels Dec 8, 2021
@dmsnell dmsnell changed the title Add types to the useSelect function [@wordpress/data] Add types to the useSelect function Dec 8, 2021
@github-actions
Copy link

github-actions bot commented Dec 8, 2021

Size Change: +8 B (0%)

Total Size: 1.21 MB

Filename Size Change
build/data/index.min.js 8.2 kB +8 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/admin-manifest/index.min.js 1.24 kB
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.49 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 146 kB
build/block-editor/style-rtl.css 15.1 kB
build/block-editor/style.css 15.1 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.89 kB
build/block-library/blocks/navigation/style.css 1.88 kB
build/block-library/blocks/navigation/view.min.js 2.85 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 389 B
build/block-library/blocks/pullquote/style.css 388 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 201 B
build/block-library/blocks/quote/style.css 201 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 934 B
build/block-library/common.css 932 B
build/block-library/editor-rtl.css 9.97 kB
build/block-library/editor.css 9.97 kB
build/block-library/index.min.js 169 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 11.2 kB
build/block-library/style.css 11.3 kB
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 670 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 46.8 kB
build/components/index.min.js 218 kB
build/components/style-rtl.css 15.6 kB
build/components/style.css 15.6 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 14.3 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.53 kB
build/edit-navigation/index.min.js 16.1 kB
build/edit-navigation/style-rtl.css 4.04 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 29.8 kB
build/edit-post/style-rtl.css 7.07 kB
build/edit-post/style.css 7.07 kB
build/edit-site/index.min.js 44.9 kB
build/edit-site/style-rtl.css 7.44 kB
build/edit-site/style.css 7.42 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.39 kB
build/edit-widgets/style.css 4.39 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 4.29 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences/index.min.js 1.2 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@@ -106,7 +109,7 @@ export default function useSelect( mapSelect, deps ) {
// `_mapSelect` if we can.
const callbackMapper = useCallback(
hasMappingFunction ? mapSelect : noop,
deps
deps ?? []
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change is (weirdly) causing unit tests to fail 😅

Copy link
Member Author

@dmsnell dmsnell Jan 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed by casting deps

@ockham
Copy link
Contributor

ockham commented Dec 14, 2021

Could something (pretty verbose and somewhat redundant) like this maybe work? (Just tinkering, I might even be totally misreading SelectMapper):

export type StoreConfigOf< T extends SelectChooser > = T extends (
	select: ( reference: StoreDescriptor< infer Config > ) => MapOf< Function >,
	registry: DataRegistry
) => unknown
	? Config
	: any;

(ideally replacing MapOf< Function > with SelectorsOf< Config >, but that seems to involve extra work)

and then

export default function useSelect(
	mapSelect: SelectChooser,
	deps?: unknown[]
): SelectChooser extends SelectMapper
	? any
	: SelectorsOf< StoreConfigOf< typeof mapSelect > > {

@ockham
Copy link
Contributor

ockham commented Dec 14, 2021

(ideally replacing MapOf< Function > with SelectorsOf< Config >, but that seems to involve extra work)

Oh, SelectorsOf< infer Config > could work maybe?

@ockham
Copy link
Contributor

ockham commented Dec 14, 2021

Ah, I think I got the order of the conditional type in the return type of useSelect wrong. So maybe

export type StoreConfigOf<
	T extends SelectChooser
> = T extends StoreDescriptor< infer Config > ? Config : any;

@dmsnell
Copy link
Member Author

dmsnell commented Dec 22, 2021

@ockham thanks for the review!!!

Could something like this maybe work?

Eventually that's where I'd like to go but I've had trouble getting there. In fact I have some uncommitted changes on my laptop I've been playing with but I frequently get back to the same point where the types seem to unify but fail to provide any insight. That is, the inferred types end up any or unknown even though it reads like it should have more concrete information about the values.

I'm not sure if I've done things wrong or TypeScript is giving up in these cases. You can inspect that in a new branch I just now pushed

Thankfully I pushed this PR out before going further down that route because I felt like it was a dead end for now. In its place I'm hoping this helps some without trapping us later.

Oh, SelectorsOf< infer Config > could work maybe?

Another eventuality I hope, but for now that type is intentionally a bit ambiguous. We'll need to/want to be able to remove the state parameter from the signature for the given selectors (because wp/data curries it) when referring to the selectors from the outside but those types may be still referenced internally in their non-curried form. None of this is super clear to me at the moment after staring at it for a while, but that's why some places that could call SelectorsOf<> don't.

@ockham
Copy link
Contributor

ockham commented Dec 22, 2021

Could something like this maybe work?

Eventually that's where I'd like to go but I've had trouble getting there. In fact I have some uncommitted changes on my laptop I've been playing with but I frequently get back to the same point where the types seem to unify but fail to provide any insight. That is, the inferred types end up any or unknown even though it reads like it should have more concrete information about the values.

Yeah, that's pretty much also the furthest I got after a bit of tinkering.

I'm not sure if I've done things wrong or TypeScript is giving up in these cases.

Can't speak for you, but with regards to the stuff I've tried, I'm thinking PEBCAK rather than TS is to blame 😬 My hypothesis is that some of the extends ... ? MeaningfulType : any ternaries return the any even though I think they should return the MeaningfulType cause I somehow didn't get the extends type right.

You can inspect that in a new branch I just now pushed

Ahr yeah, some of that looks similar to my notes. Thanks for sharing!

Thankfully I pushed this PR out before going further down that route because I felt like it was a dead end for now. In its place I'm hoping this helps some without trapping us later.

Makes sense 👍 Well I sure don't object to merging this pretty-much as is. I think we need to update some docs that the linter is complaining about, but other than that -- :shipit: ? 😄

Oh, SelectorsOf< infer Config > could work maybe?

Another eventuality I hope, but for now that type is intentionally a bit ambiguous. We'll need to/want to be able to remove the state parameter from the signature for the given selectors (because wp/data curries it) when referring to the selectors from the outside but those types may be still referenced internally in their non-curried form. None of this is super clear to me at the moment after staring at it for a while, but that's why some places that could call SelectorsOf<> don't.

🍛 👌

@dmsnell
Copy link
Member Author

dmsnell commented Dec 22, 2021

My hypothesis is that some of the extends ... ? MeaningfulType : any ternaries return the any

Try using never instead of any. Those type helpers only use the conditionals because we have to and because we can't do this, which would be way more useful.

const foo = <Mapper extends SelectMapper<infer Config>>(mapper: Mapper): Config['selectors'] => {}

We have to use those in the return type and we have to provide a type for the condition, even if it can't fail.

type Goofy<A extends string> = A extends string ? A : never;

And so if you think it's returning any and you replace that with never you'll know instantly because it would show a complete type failure at that point. What's surprising is to have Condition ? string : never and still get an any

@ockham
Copy link
Contributor

ockham commented Dec 22, 2021

Thanks -- good point about the never.

I've started to try and debug this by looking at some intermediate types. E.g. for my aforementioned StoreConfigOf, I'd try something like

import { store as coreStore } from '@wordpress/core-data';
/*...*/

type StoreConf = StoreConfigOf< typeof coreStore >;

and then hover over StoreConf in VSCode for it to tell me what type it'd get assigned. (This might be obvious to you, but I thought I'd mention just in case.)

@dmsnell dmsnell force-pushed the dmsnell/use-select-types branch from 431562f to 7f9e829 Compare January 6, 2022 20:47
@dmsnell
Copy link
Member Author

dmsnell commented Jan 6, 2022

Having trouble debugging the update-api-docs step, which is holding up this PR. All I can get is…

TypeError: Cannot read properties of undefined (reading 'name')
    at makeError (/Users/dmsnell/code/gutenberg/node_modules/execa/lib/error.js:59:11)
    at handlePromise (/Users/dmsnell/code/gutenberg/node_modules/execa/index.js:114:26)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Transform.<anonymous> (/Users/dmsnell/code/gutenberg/bin/api-docs/update-api-docs.js:217:5) {
  shortMessage: 'Command failed with exit code 1: "/Users/dmsnell/code/gutenberg/node_modules/.bin/docgen" packages/data/src/index.js --output packages/data/README.md --to-token --use-token "Autogenerated API docs" --ignore "/unstable|experimental/i"',
  command: '"/Users/dmsnell/code/gutenberg/node_modules/.bin/docgen" packages/data/src/index.js --output packages/data/README.md --to-token --use-token "Autogenerated API docs" --ignore "/unstable|experimental/i"',
  exitCode: 1,
  signal: undefined,
  signalDescription: undefined,
  stdout: '',
  stderr: "\nTypeError: Cannot read properties of undefined (reading 'name')",
  failed: true,
  timedOut: false,
  isCanceled: false,
  killed: false
}

I've tried running the script with node --inspect-brk but when I do that the attached debugger never stops again after the initial break. I think this error is somehow trapped and printed somewhere.

@dmsnell
Copy link
Member Author

dmsnell commented Jan 6, 2022

API doc generation seems to fail when we are re-exporting some of the context providers without JSDoc types

Works

 * @param {boolean} props.value Enable Async Mode.
 * @return {WPComponent} The component to be rendered.
 */
export default Provider;
 * (no JSDoc info for parameter `value` and return)
 */
export default Provider;

Doesn't work

 * @param props.value Enable Async Mode.
 * @return The component to be rendered.
 */
export default Provider;
 * @param value Enable Async Mode.
 * @return The component to be rendered.
 */
export default Provider;

@dmsnell dmsnell force-pushed the dmsnell/use-select-types branch from 7f9e829 to b3758b6 Compare January 12, 2022 20:49
@dmsnell dmsnell marked this pull request as ready for review January 12, 2022 21:32
@dmsnell dmsnell requested a review from nerrad as a code owner January 12, 2022 21:32
registry: DataRegistry
): unknown;
}
export type SelectChooser = SelectMapper | StoreReference;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like something very specific to the useSelect hook and not a "meaningful" type. It's just a nitpick and I don't really have experience with typescript much but I'd have avoided a named typed for this one and just inlined it personally.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this appears again in the type for DataRegistry for the select function. I was going to move it but forgot about that one. in time I'd like to come up with some better descriptions and names for these but I think for now at least we need to keep it here or duplicate the definition (which I'd rather avoid) so we don't cause false negatives on registry objects.

@dmsnell dmsnell force-pushed the dmsnell/use-select-types branch from aee14c0 to 7f839c4 Compare January 19, 2022 15:32
@dmsnell dmsnell force-pushed the dmsnell/use-select-types branch 2 times, most recently from ef8e8bc to cdcb1bd Compare February 23, 2022 21:15
@dmsnell
Copy link
Member Author

dmsnell commented Feb 23, 2022

Anyone have thoughts on this? It's getting pretty dusty now and I'd like to push forward with it and with work that depends on it, but I don't want to start that work before this is actually in.

@dmsnell dmsnell force-pushed the dmsnell/use-select-types branch from cdcb1bd to 1db052f Compare March 18, 2022 20:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Developer Experience Ideas about improving block and theme developer experience [Package] Data /packages/data
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants