Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

Sorry, you do not have permission to ask a question, You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please type your username.

Please type your E-Mail.

Please choose an appropriate title for the post.

Please choose the appropriate section so your post can be easily searched.

Please choose suitable Keywords Ex: post, video.

Browse

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

Querify Question Shop: Explore Expert Solutions and Unique Q&A Merchandise

Querify Question Shop: Explore Expert Solutions and Unique Q&A Merchandise Logo Querify Question Shop: Explore Expert Solutions and Unique Q&A Merchandise Logo

Querify Question Shop: Explore Expert Solutions and Unique Q&A Merchandise Navigation

  • Home
  • About Us
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • About Us
  • Contact Us
Home/ Questions/Q 7762

Querify Question Shop: Explore Expert Solutions and Unique Q&A Merchandise Latest Questions

Author
  • 60k
Author
Asked: November 28, 20242024-11-28T06:50:08+00:00 2024-11-28T06:50:08+00:00

Global Type Augmentations with automagic IntelliSense

  • 60k

Automatic global type augmentations with intellisense

extend-number

If you ever wanted to add methods to a built-in type like Number or String in JavaScript, you could extend the prototype directly:

// Add helper function to number Object.defineProperty(Number.prototype,'clamp',{      enumerable: false,     value: function(min, max) {         return Math.min(Math.max(min, this), max);     } });  // Add setter to allow defining shortcuts for dom elements Object.defineProperty(HTMLElement.prototype,'shortcut',{     enumerable: false,     set: function() {         this._shortcut = value;         // register key-bindings etc     } }); 
Enter fullscreen mode Exit fullscreen mode

Now, if we try to use these functions, the type-checker will flag it as errors, and intellisense will not work:

(10).clamp(5,15) // Property 'clamp' does not exist on type number  let el = document.createElement('my-component'); el.shortcut = 'ctrl+a' // Property 'shortcut' does not exist on type HTMLElement 
Enter fullscreen mode Exit fullscreen mode

To enable type-checking and intellisense you will have to create a separate file where you declare the added methods:

// types/extensions.d.ts declare global {     interface Number {         clamp(min:number, max: number) : number;     }      interface HTMLElement {         set shortcut(value: string);     } } 
Enter fullscreen mode Exit fullscreen mode

Now, if you make sure the .d.ts file is referenced in your project, the squiggly lines should disappear, and completions should start to work!

It is not considered good practice to extend global types like this anyways, but extending (re-opening) your own classes, and augmenting interfaces of external libraries is even more clunky, and there might be good reasons for you to do it.

In Imba, where dom elements are first-class citizens and it is rather easy to create large projects that do not depend on a bunch of external web components and libraries, extending the functionality of tags and objects is not discouraged. This is how you would do it in imba:

extend class Number     def clamp(min
umber, max
umber)         return Math.min(Math.max(min,self),max)  extend tag element     set shortcut value         # register key-bindings etc  let el = <div shortcut='ctrl+a'> <span> 10.clamp(5,15)  
Enter fullscreen mode Exit fullscreen mode

That is all you need. Imba generates the correct typescript declarations (with type inference). Type-checking, goto definitions, auto-completions etc just works. If your project includes a mix of imba, js, and typescript it will work across all your files.

10.clamp(5,15) let el = <div shortcut='ctrl+a'> 
Enter fullscreen mode Exit fullscreen mode

This is even better than it seems. Imba also does type inference from your actual declarations, which makes things a lot less verbose. Let's allow all custom components to easily access a shared api:

import API from './api' const api = new API  extend tag component     get api         api 
Enter fullscreen mode Exit fullscreen mode

Now, all components Imba will have direct access to the api. Again, with intellisense.

# define a custom button tag edit-user-button < button     <self @click=api.editUser(data)> 'edit user'  # use it in another custom component tag user-modal     <self>         <h1> "User"         <.actions>             <edit-user-button data=user>             ...  # No need to pass the api down into children, or import it from every file. 
Enter fullscreen mode Exit fullscreen mode

If you want to add functionality to your api without writing it all in one file, you can simply extend the class:

import API from './api'  extend class API     def broadcast eventstring, data = {}         # do something here ...         self 
Enter fullscreen mode Exit fullscreen mode

If you would like to know more about Imba, read the latest dev.to post or go to imba.io 🙂

extend-element

imbajavascripttypescriptwebdev
  • 0 0 Answers
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

Sidebar

Ask A Question

Stats

  • Questions 4k
  • Answers 0
  • Best Answers 0
  • Users 2k
  • Popular
  • Answers
  • Author

    How to ensure that all the routes on my Symfony ...

    • 0 Answers
  • Author

    Insights into Forms in Flask

    • 0 Answers
  • Author

    Kick Start Your Next Project With Holo Theme

    • 0 Answers

Top Members

Samantha Carter

Samantha Carter

  • 0 Questions
  • 20 Points
Begginer
Ella Lewis

Ella Lewis

  • 0 Questions
  • 20 Points
Begginer
Isaac Anderson

Isaac Anderson

  • 0 Questions
  • 20 Points
Begginer

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help

Footer

Querify Question Shop: Explore Expert Solutions and Unique Q&A Merchandise

Querify Question Shop: Explore, ask, and connect. Join our vibrant Q&A community today!

About Us

  • About Us
  • Contact Us
  • All Users

Legal Stuff

  • Terms of Use
  • Privacy Policy
  • Cookie Policy

Help

  • Knowledge Base
  • Support

Follow

© 2022 Querify Question. All Rights Reserved

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.