The answer, as far as I can tell, is no, because the type overlap means the type guard won't narrow the types. setup loops; never enters loop - restarting? Why is the US residential model untouchable and unquestionable? In the twin paradox or twins paradox what do the clocks of the twin and the distant star he visits show when he's at the star? Are strongly-typed functions as parameters possible in TypeScript? The title asks about differentiation between two functions with different arity, whereas the body of the post asks about making an argument "required", in essence. What are the purpose of the extra diodes in this peak detector circuit (LM1815)? In the US, how do we make tax withholding less if we lost our job for a few months? Is there a political faction in Russia publicly advocating for an immediate ceasefire? For now, I'm using nominal types. You may want to amend one or the other. To learn more, see our tips on writing great answers. Connect and share knowledge within a single location that is structured and easy to search. "Selected/commanded," "indicated," what's the third word? What purpose are these openings on the roof? How do you explicitly set a new property on `window` in TypeScript? Typescript doesn't complain when misusing a function passed as a prop in React. To do this in a type-safe way, I need to be able to "tell" TS which functions have more than one argument. Is it against the law to sell Bitcoin at a flea market? OneArg : NoArg will not work, because it always resolves to OneArg. How to help player quickly make a decision when they have no way of knowing which option is best. By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. The solution relies on using a conditional type, coupled with the fact that the one-argument function is incompatible with the zero-argument type (even though the reverse is not true), to coerce the correct types. Site design / logo 2022 Stack Exchange Inc; user contributions licensed under CC BY-SA. In Typescript, what is the ! (exclamation mark / bang) operator when dereferencing a member? Can climbing up a tree prevent a creature from being targeted with Magic Missile? UPDATE: In the comments below, a question was raised as to whether this could be achieved with a type guard test. Only the first assigned generates a compiler error. Your title (which doesn't need the tag TypeScript in it) asks a different question from the body of the post. But that said, is there any way to construct a version of the OneArg interface that will not be compatible with a zero argument function? In the case of the first type, my function passes them on, in the case of the second it converts them to curried functions so args is captured in the closure of the useSelector()-acceptable format. I understand why this is the case, because JavaScript allows functions to be passed with less than their complete set of possible arguments, and thats different than saying the arguments are optional which has to do with how the function is called rather than how its passed. By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. But that, or any other type of nominal typing solution, requires doing extra work on assignment (e.g., you have to explicitly add the _brand property to the function). Making statements based on opinion; back them up with references or personal experience. Make a function parameter required in TypeScript, Design patterns for asynchronous API communication. What is "not assignable to parameter of type never" error in TypeScript? rev2022.7.21.42639. Im hoping it doesnt since this isnt a callback parameter, but perhaps the rationale is the same. I think so, because you only need one discriminator function vs two branding functions. Is a neuron's information processing more complex than a perceptron? @sam256 How do you tell at runtime which functions are which? Well, my use case is a function that takes functions in either the format (state) => {//function} or (state, args) => {//function} and converts them into functions for use in the useSelector() react-redux hook, which only allows the (state)=> {} form. How to convert a string to number in TypeScript? Why does KLM offer this specific combination of flights (GRU -> AMS -> POZ) just on one day when there's a time change? See the FAQ. What are the "disks" seen on the walls of some NASA space shuttles? Thanks for contributing an answer to Stack Overflow!
Anyone see any problems with this solution? Typescript: Required callback parameters? You can see it in this playground. After some discussion with @aluan-haddad, I have a partial solution. NB: To my point that this is relying on the one argument function being incompatible with the zero type function, note that the reverse version of the conditional type T extends (x:number)=>any ? Why do the displayed ticks from a Plot of a function not match the ones extracted through Charting`FindTicks in this case? Where developers & technologists share private knowledge with coworkers, Reach developers & technologists worldwide. The FAQ linked above says There is currently not a way in TypeScript to indicate that a callback parameter must be present. Does that completely rule out what I want to do here? I can't get exactly what I asked for, i.e., an "automatic" type definition that distinguishes between a function with the required parameter and one without, but I have come up with a "discriminator" function that will distinguish between the two functions and apply an appropriate branded type. JavaScript front end for Odin Project book library database. I understand this can be done via branding or nominal typing, e.g.. I would really like to see a real world use case for that benefits from this behavior. So my question isis there any way to construct a type NoArg that will fail the simple assignment let oneArg: OneArg = ()=>{}? Which Terry Pratchett book starts with "Zoom in"? Find centralized, trusted content and collaborate around the technologies you use most. What drives the appeal and nostalgia of Margaret Thatcher within UK Conservative Party? To subscribe to this RSS feed, copy and paste this URL into your RSS reader. Is there a better one, or is this all TS permits? Announcing the Stacks Editor Beta release! Asking for help, clarification, or responding to other answers. Now, is this better than "branding" the functions in the first place via constructor functions? And also because you don't necessarily need to know the signatures of your functions ex-ante, i.e., when you pass them to the discriminator. I don't think you need to be worried about this because typescript won't allow you to call that function without any arguments. How do I dynamically assign properties to an object in TypeScript?