refactor(interfaces): Make type predicates more robust by cpcallen · Pull Request #9150 · RaspberryPiFoundation/blockly

added 3 commits

June 17, 2025 14:26
Testing for

    'name' in object

or

    obj.name !== undefined

only checks for the existence of the property (and in the latter
case that the property is not set to undefined).  That's fine if
the interface specifies a property of indeterminate type, but in
the usual case that the interface member is a method we can do
one better and check to make sure the property's value is
callable.
Since most type predicates take an argument of type any but then
check for the existence of certain properties, explicitly check
that the argument is not null or undefined (or check implicitly
by calling another type predicate that does so first, which
necessitates adding a few casts because tsc infers the type of
the argument too narrowly).

@cpcallen

@cpcallen

Introduce a new MockFocusable, and add methods to MockIcon,
MockBubbleIcon and MockComment, so that they fulfil the
IFocusableNode, IIcon, IHasBubble and ICommentIcon interfaces
respectively.
Add (test) runtime assertions that:

- isFocusableNode(MockFocusable) returns true
- isIcon(MockIcon) returns true
- hasBubble(MockBubbleIcon) returns true
- isCommentIcon(MockCommentIcon) returns true

(The latter is currently failing because Blockly is undefined when
isCommentIcon calls the MockCommentIcon's getType method.)
For some reason the global Blockly binding is not visible at the
time when isCommentIcon calls MockCommentIcon's getType method,
and presumably this problem would apply to getBubbleSize too,
so directly import the required items.
This slightly simplifies it and makes it less likely to accidentally
stop conforming to IHasBubble.
Fix an error which caused ISelectable instances to fail
isSelectable() checks, one of the results of which is that
Blockly.common.getSelected() would generally return null.

Whoops!

@cpcallen cpcallen marked this pull request as ready for review

June 19, 2025 16:29

maribethb

@cpcallen cpcallen deleted the fix/interface-predicates branch

June 25, 2025 11:49