Comments (3)
Hi @Hyzual! Thanks for such nice words about the project. I am eager to help if you encounter any other problems.
Fortunately, I am currently using at work hybrids in TypeScript, so I've found many bugs in typings and I fixed them already. You can easily fix your problem by adding an explicit definition of the content
property (for the render would be the same), if you use the render
factory implicitly. However, you could ask why, as it works well without that?
There are two reasons. The first is the TS limitation itself. It does not support generic values (more here: microsoft/TypeScript#17574), so we are required to create an interface instead of taking it from the hybrids object (we cannot pass the dynamic type itself as an argument of the function within that definition). Ultimately, I would like to have only hybrids definition without an additional interface (as it usually is just redundant).
The second reason is the dynamic behavior of the property definition. You are not forced to use render
factory, when defining render
or content
property. The factory is used only if the property definition is a function (look at the translation rules). Because of that, the Hybrids
or TaggedHybrids
type cannot assume that your content
or render
will use that factory for sure, so it is defined in the way, that if you don't use those in other properties, it allows to set them as a function. However, if you need that property in another call, you must set it explicitly.
For the render factory, the interface property should be defined as () => HTMLElement
, and adding that field fixes your issue:
interface ComponentWithRef {
button: HTMLButtonElement | null;
content: () => HTMLElement;
}
I did some other small fixes (use "as" in querySelector()
as it returns Element
type instead). You can check out the full example here (your forked example): https://codesandbox.io/s/hybrids-query-content-in-typescript-issue-forked-60gh3?file=/src/index.ts:87-183
EDIT: PS. I now that TS docs are not the best, just one document, so I think I will add extending docs for more TS examples to my todo list :)
from hybrids.
Thank you very much for the quick and detailed answer! I'll be sure to take a look at it, probably not before Monday.
from hybrids.
Hi, I have finally got some time to test your solution and it did work wonderfully, thank you very much
If you need my help, I could try submitting a pull request for the typescript docs to help document that.
from hybrids.
Related Issues (20)
- Nested arrays and objects in store could use more 'splaining HOT 2
- import as node module (import {...} from 'hybrids') doesn't work HOT 3
- Update to documentation HOT 2
- Custom methods on component ? HOT 2
- Tailwind integration HOT 2
- Update Store based on previous value HOT 10
- How to compile statically? HOT 5
- Typing Issue When Redefining HTMLElement Built-In Properties HOT 2
- AsyncIterator HOT 2
- Initializing object properties with `undefined` no longer accepted in v8.0.0 HOT 4
- Feature Request: Custom Elements Manifest Analyzer HOT 2
- Class attribute mix-in _on_ the web-component HOT 12
- Extension for FLIP / Miotion Animations in planning? HOT 10
- Timing of connect during instantiation HOT 13
- Rendering components without the ShadowDOM? HOT 1
- Working with Chart.js HOT 1
- `class` attribute changes rendering in v8.1.7 HOT 4
- render function mutating host property breaks rendering in v8.1.6 HOT 5
- Properties assigned undefined when accessing them for the first time HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from hybrids.