{"id":127124,"date":"2025-01-16T10:52:35","date_gmt":"2025-01-16T18:52:35","guid":{"rendered":""},"modified":"2025-09-04T16:13:38","modified_gmt":"2025-09-04T23:13:38","slug":"user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward","status":"publish","type":"post","link":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/","title":{"rendered":"User defined functions, user defined types, and enhanced component properties move forward"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I&#8217;m pleased to announce updates that will make Power Fx formula reuse and maintenance easier than ever:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\"><a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/object-app#user-defined-functions\">User defined functions<\/a> (UDFs) can now include behavior functions with side effects, such as <strong><a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-set\">Set<\/a><\/strong>, <strong><a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-clear-collect-clearcollect\">Collect<\/a><\/strong>, <strong><a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-reset\">Reset<\/a><\/strong>, and <strong><a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-showerror\">Notify<\/a><\/strong>. Declarative is always best, so use this facility only when you must. When you do, wrap the formula in <code>{ }<\/code> and you can then use the <code>;<\/code> (or <code>;;<\/code>) chaining operator.<\/li>\n\n\n\n<li class=\"wp-block-list-item\"><a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/object-app#user-defined-types\">User defined types<\/a> (UDTs) enable tables and records to be passed in and out of UDFs. UDTs also enable bulk conversion of JSON untyped objects to typed objects, particularly useful with web APIs. Welcome the new <a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-type\"><strong>Type<\/strong> and <strong>RecordOf<\/strong> functions<\/a>, an expanded role for the <strong><a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-astype-istype\">AsType<\/a><\/strong> and <strong><a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-astype-istype\">IsType<\/a><\/strong> functions, and a new parameter for <strong><a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-parsejson\">ParseJSON<\/a><\/strong>.<\/li>\n\n\n\n<li class=\"wp-block-list-item\"><a href=\"https:\/\/learn.microsoft.com\/power-apps\/maker\/canvas-apps\/component-properties\">Enhanced component properties<\/a> (ECPs) have moved to preview.  With any remaining feedback, we plan to take them to general availability in the next few months.  ECPs enable the ability to share logic across apps through a component library.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This is the last major update to UDFs planned before we start down the road to general availability. UDTs will be on the same timeline. Now is the time to take this functionality through its final paces and provide feedback before the design is locked; please leave feedback in the <a href=\"https:\/\/community.powerplatform.com\/forums\/thread\/details\/?threadid=b935ddfa-39d4-ef11-8eea-6045bddb7cb0\">community experimental features forum<\/a>. Both features are experimental and require turning on these switches in <strong>Settings<\/strong> &gt; <strong>Updates<\/strong> &gt; <strong>Experimental<\/strong>:<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/2025-01-14_17h33_14.webp\" alt=\"A screenshot of a computer\" class=\"wp-image-127129 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/2025-01-14_17h33_14.webp\"><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"behavior-udfs\">Behavior UDFs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Named formulas depend on being declarative, something the system can defer and recalc based on changes in the app. They can&#8217;t have side effects, such as incrementing a variable, or this wouldn&#8217;t be possible.  UDFs to date have built on top of named formulas by adding parameters, but still had to be declarative.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Obviously, that is limiting for an app. We need buttons, buttons that do important things like updating a database. We&#8217;d like to be able to put that logic in a UDF too. And now you can, by wrapping the UDF in curly braces:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>CountUp( increment : Number ) : Void = { <br>\u00a0\u00a0\u00a0\u00a0Set( x, x+increment ); <br>\u00a0\u00a0\u00a0\u00a0Notify( $\"Count: {x}\" ); <br>};<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This simple example will increment the global variable <code>x<\/code> and display a notification with the result each time <code>CountUp(1)<\/code> is called from, say, the OnSelect formula of a Button control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is a huge step for reuse and manageability. Now you can extract and parameterize your action logic and reuse it throughout your app, having only one source of truth for that logic that is easier to maintain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For more information and examples, see <a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/object-app#behavior-user-defined-functions\">Behavior user defined functions<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"user-defined-types\">User Defined Types<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">User defined types enable UDFs to take in and return records and tables. Until now, UDFs were limited to scalar data types, such as <a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/data-types\"><strong>Number<\/strong>, <strong>Text<\/strong>, <strong>DateTime<\/strong><\/a>, etc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The new <a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-type\"><strong>Type<\/strong> function<\/a> is the key. Use it to define a named formula for a type, using the same syntax you would use for a literal record or table value. For example, imagine you had a table of paper sizes:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>PaperSizes =<br>[ { Name: \"A4\", Width: 210, Height: 297 },<br>\u00a0\u00a0{ Name: \"Letter\", Width: 216, Height: 279 },<br>\u00a0\u00a0{ Name: \"Legal\", Width: 216, Height: 356 } ];<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We can define types for a single paper as a special kind of named formula that uses the <code>:=<\/code> assignment operator and <strong>Type<\/strong> function. The syntax used within the Type function is the same as the literal record values in the PaperSizes definition, with specific values replaced by their data type names:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>PaperType := Type( { Name: Text, Width: Number, Height: Number } );<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We can now use this type to pass a single paper size into a UDF:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>PaperArea( Paper: PaperType ): Number = Paper.Width * Paper.Height;<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And we can call our UDF with:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>PaperArea( First( PaperSizes ) )   \/\/ returns the number 62370<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We can define a type for a table, matching the type of PaperSizes:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>MultiPaperType := Type( [ PaperType ] );<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And then define a function to filter a table of paper sizes:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>LargePaperSizes( Papers: MultiPaperType ) : MultiPaperType =<br>\u00a0\u00a0\u00a0\u00a0Filter( Papers, PaperArea( ThisRecord ) &gt; 70000 <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And then we can call it with:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>LargePaperSizes( PaperSizes )<br>\/\/ returns [ { Name: \"Legal\", Width: 216, Height: 356 } ]<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For more information and examples, see <a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/object-app#user-defined-types\">User defined types<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"json-and-untyped-udts\">JSON and Untyped \u2764\ufe0f UDTs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">UDTs are great for UDFs.  But they have another great use case: converting an untyped object to a typed object.  Imagine that JSON was returned from a web API for another set of paper sizes:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>MorePaperSizes = <\/code><br><code>\"[ { \"\"Name\"\": \"\"A0\"\", \"\"Width\"\": 841, \"\"Height\"\": 1189 },<br>    { \"\"Name\"\": \"\"A6\"\", \"\"Width\"\": 105, \"\"Height\"\": 148 } ]\";<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You probably know that you can use the ParseJSON function to convert this to an Untyped object.  <\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>MoreUntyped = ParseJSON( MorePaperSizes )<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">From which you can extract individual elements from the JSON by casting them explicitly or implicitly at the point of use.  But since the structure is untyped and potentially heterogenous, it cannot be used with functions such as AddColumns which requires a homogenous Power Fx table:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>AddColumns( MoreUntyped, InStock, true )  \/\/ error<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With UDTs, we can now convert this JSON directly to a Power Fx typed object by providing the type as the second parameter to ParseJSON:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>MoreTyped = ParseJSON( MorePaperSizes, MultiPaperType )<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And now we can add a column:<\/p>\n\n\n\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow has-quote-default-font-size wp-block-paragraph\"><code>AddColumns( MoreTyped, InStock, true )  \/\/ OK<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/learn.microsoft.com\/power-platform\/power-fx\/reference\/function-astype-istype\"><strong>IsType<\/strong> and <strong>AsType<\/strong> functions<\/a> have also been overloaded to take an untyped object and type arguments. Web APIs that return an untyped object can now be easily converted to a typed object.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"feedback-please\">Feedback, please!<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These are experimental features, and for good reason, we are still making changes. There are a lot of nuanced details with UDFs and UDTs we want to make sure we get right. We&#8217;d love to hear your feedback on how it works, please let us know in the <a href=\"https:\/\/community.powerplatform.com\/forums\/thread\/details\/?threadid=b935ddfa-39d4-ef11-8eea-6045bddb7cb0\">community experimental features forum<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>More Power Fx formula reuse! User defined functions can now call behavior functions with side effects and be chained. User defined types enable passing records and tables in and out of user defined functions and can type JSON and untyped objects. And enhanced component properties move to preview.<\/p>\n","protected":false},"author":86,"featured_media":128897,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ms_queue_id":[],"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","_alt_title":"","ms-ems-related-posts":[],"footnotes":""},"audience":[3378],"content-type":[],"job-role":[],"product":[3473],"property":[],"topic":[3421],"coauthors":[2332],"class_list":["post-127124","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","audience-it-professional","product-power-apps","topic-application-modernization","review-flag-1593580362-167","review-flag-1593580428-604","review-flag-1593580420-967","review-flag-1593580771-307","review-flag-1-1593580433-195","review-flag-alway-1593580310-178","review-flag-gener-1593580751-312","review-flag-new-1593580248-627"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>User defined functions, user defined types, and enhanced component properties move forward - Microsoft Power Platform Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"User defined functions, user defined types, and enhanced component properties move forward - Microsoft Power Platform Blog\" \/>\n<meta property=\"og:description\" content=\"More Power Fx formula reuse! User defined functions can now call behavior functions with side effects and be chained. User defined types enable passing records and tables in and out of user defined functions and can type JSON and untyped objects. And enhanced component properties move to preview.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft Power Platform Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-16T18:52:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-04T23:13:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Greg Lindhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Greg Lindhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/\"},\"author\":[{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/greg-lindhorst\/\",\"@type\":\"Person\",\"@name\":\"Greg Lindhorst\"}],\"headline\":\"User defined functions, user defined types, and enhanced component properties move forward\",\"datePublished\":\"2025-01-16T18:52:35+00:00\",\"dateModified\":\"2025-09-04T23:13:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/\"},\"wordCount\":825,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg\",\"keywords\":[\"Power Fx\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/\",\"name\":\"User defined functions, user defined types, and enhanced component properties move forward - Microsoft Power Platform Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg\",\"datePublished\":\"2025-01-16T18:52:35+00:00\",\"dateModified\":\"2025-09-04T23:13:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#primaryimage\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg\",\"contentUrl\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg\",\"width\":2560,\"height\":1440,\"caption\":\"A woman sitting at a desk with a computer screen\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"User defined functions, user defined types, and enhanced component properties move forward\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/\",\"name\":\"Microsoft Power Platform Blog\",\"description\":\"Innovate with Business Apps\",\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization\",\"name\":\"Microsoft Power Platform Blog\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"contentUrl\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"width\":194,\"height\":145,\"caption\":\"Microsoft Power Platform Blog\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/person\/dbd4cb8af4503e696f240353831f05d4\",\"name\":\"Greg Lindhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g0133d144d5ed416197bd3b29ccd9a59c\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g\",\"caption\":\"Greg Lindhorst\"},\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/gregli\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"User defined functions, user defined types, and enhanced component properties move forward - Microsoft Power Platform Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/","og_locale":"en_US","og_type":"article","og_title":"User defined functions, user defined types, and enhanced component properties move forward - Microsoft Power Platform Blog","og_description":"More Power Fx formula reuse! User defined functions can now call behavior functions with side effects and be chained. User defined types enable passing records and tables in and out of user defined functions and can type JSON and untyped objects. And enhanced component properties move to preview.","og_url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/","og_site_name":"Microsoft Power Platform Blog","article_published_time":"2025-01-16T18:52:35+00:00","article_modified_time":"2025-09-04T23:13:38+00:00","og_image":[{"width":2560,"height":1440,"url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg","type":"image\/jpeg"}],"author":"Greg Lindhorst","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Greg Lindhorst","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#article","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/"},"author":[{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/greg-lindhorst\/","@type":"Person","@name":"Greg Lindhorst"}],"headline":"User defined functions, user defined types, and enhanced component properties move forward","datePublished":"2025-01-16T18:52:35+00:00","dateModified":"2025-09-04T23:13:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/"},"wordCount":825,"commentCount":0,"publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg","keywords":["Power Fx"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/","name":"User defined functions, user defined types, and enhanced component properties move forward - Microsoft Power Platform Blog","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#primaryimage"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg","datePublished":"2025-01-16T18:52:35+00:00","dateModified":"2025-09-04T23:13:38+00:00","breadcrumb":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#primaryimage","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg","contentUrl":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2025\/01\/MSC24-ASEAN-developer-Getty-1451309426-rgb-scaled.jpg","width":2560,"height":1440,"caption":"A woman sitting at a desk with a computer screen"},{"@type":"BreadcrumbList","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/user-defined-functions-user-defined-types-and-enhanced-component-properties-move-forward\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/"},{"@type":"ListItem","position":2,"name":"User defined functions, user defined types, and enhanced component properties move forward"}]},{"@type":"WebSite","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/","name":"Microsoft Power Platform Blog","description":"Innovate with Business Apps","publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization","name":"Microsoft Power Platform Blog","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","contentUrl":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","width":194,"height":145,"caption":"Microsoft Power Platform Blog"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/person\/dbd4cb8af4503e696f240353831f05d4","name":"Greg Lindhorst","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g0133d144d5ed416197bd3b29ccd9a59c","url":"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d2e26bc357423265c4eeeb6a4ed51bd71fb29b8eced3e31f4bc1ccd5bedaf80f?s=96&d=mm&r=g","caption":"Greg Lindhorst"},"url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/gregli\/"}]}},"bloginabox_animated_featured_image":null,"bloginabox_display_generated_audio":false,"distributor_meta":false,"distributor_terms":false,"distributor_media":false,"distributor_original_site_name":"Microsoft Power Platform Blog","distributor_original_site_url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog","push-errors":false,"_links":{"self":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/127124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/users\/86"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/comments?post=127124"}],"version-history":[{"count":17,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/127124\/revisions"}],"predecessor-version":[{"id":132409,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/127124\/revisions\/132409"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/media\/128897"}],"wp:attachment":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/media?parent=127124"}],"wp:term":[{"taxonomy":"audience","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/audience?post=127124"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/content-type?post=127124"},{"taxonomy":"job-role","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/job-role?post=127124"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/product?post=127124"},{"taxonomy":"property","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/property?post=127124"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/topic?post=127124"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/coauthors?post=127124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}