{"id":18995041,"date":"2026-08-17T01:07:44","date_gmt":"2026-08-17T01:07:44","guid":{"rendered":"https:\/\/wordpress.org\/support\/topic\/bug-typeerror-d-is-not-a-constructor\/"},"modified":"2026-08-17T01:07:44","modified_gmt":"2026-08-17T01:07:44","slug":"bug-typeerror-d-is-not-a-constructor","status":"publish","type":"topic","link":"https:\/\/wordpress.org\/support\/topic\/bug-typeerror-d-is-not-a-constructor\/","title":{"rendered":"Bug: TypeError: d is not a constructor"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Hello,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Thank you for maintaining Widget Options. I would like to report a compatibility bug with the\u00a0Gutenberg Page &amp; Post Block Options\u00a0module, and request a fix.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Environment<\/strong><\/p>\n\n\n\n<ul>\n<li>Widget Options version:\u00a04.2.5<\/li>\n\n\n\n<li>WordPress: 7.0.4<\/li>\n\n\n\n<li>Gutenberg \/ Block Editor (core)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What happens<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When\u00a0<strong>Gutenberg Page &amp; Post Block Options<\/strong>\u00a0is enabled:<\/p>\n\n\n\n<ol>\n<li>Open the block editor on a page\/post.<\/li>\n\n\n\n<li>Insert or open a custom block whose registered\u00a0<code>edit<\/code>\u00a0component is wrapped with\u00a0<code>React.memo<\/code>\u00a0(or another non-callable React element type such as\u00a0<code>forwardRef<\/code>\u00a0\/\u00a0<code>lazy<\/code>).<\/li>\n\n\n\n<li>The block fails to mount and shows:<br \/>\u201cThis block has encountered an error and cannot be previewed.\u201d<\/li>\n\n\n\n<li>Browser console error (minified variable name may differ):<br \/><code>TypeError: d is not a constructor<\/code><br \/>at the filter registered on\u00a0<code>blocks.registerBlockType<\/code>\u00a0in<br \/><code>includes\/widgets\/gutenberg\/build\/index.js<\/code><br \/>(namespace:\u00a0<code>extended-widget-options\/sidebar-component<\/code>), inside the\u00a0<code>try<\/code>\u00a0\/\u00a0<code>catch<\/code>\u00a0that ends with\u00a0<code>return new d(e)<\/code>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Core blocks such as Paragraph work normally.<br \/>The issue only appears for blocks whose registered&nbsp;<code>edit<\/code>&nbsp;is not a plain function\/class (for example,&nbsp;<code>memo<\/code>-wrapped components).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Disabling\u00a0<strong>Gutenberg Page &amp; Post Block Options<\/strong>\u00a0resolves the error immediately.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Root cause<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In\u00a0<code>includes\/widgets\/gutenberg\/build\/index.js<\/code>, the plugin adds a\u00a0<code>blocks.registerBlockType<\/code>\u00a0filter that wraps every block\u2019s\u00a0<code>edit<\/code>\u00a0roughly like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>const d = settings.edit;<br \/>settings.edit = function ( props ) {<br \/><em>  \/\/ ... initialize extended_widget_opts_* attributes ...<\/em><br \/>  try {<br \/>    return d( props ); <em>\/\/ call as a function<\/em><br \/>  } catch ( err ) {<br \/>    return new d( props ); <em>\/\/ fallback: treat as a class constructor<\/em><br \/>  }<br \/>};<\/code><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is not how React components should be rendered.<\/p>\n\n\n\n<ul>\n<li>Gutenberg normally renders\u00a0<code>edit<\/code>\u00a0via\u00a0<code>wp.element.createElement( OriginalEdit, props )<\/code>.<\/li>\n\n\n\n<li>Calling\u00a0<code>OriginalEdit(props)<\/code>\u00a0only works for\u00a0plain function components.<\/li>\n\n\n\n<li><code>new OriginalEdit(props)<\/code>\u00a0only works for\u00a0class components.<\/li>\n\n\n\n<li>Components created with\u00a0<code>React.memo()<\/code>,\u00a0<code>forwardRef()<\/code>,\u00a0<code>lazy()<\/code>, etc. are\u00a0objects, not callable functions and not constructors. For those:\n<ul>\n<li><code>d(props)<\/code>\u00a0throws (e.g. \u201cis not a function\u201d)<\/li>\n\n\n\n<li><code>new d(props)<\/code>\u00a0throws\u00a0<code>TypeError: d is not a constructor<\/code>\u00a0\u2190 the error we see<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">That is why core blocks (plain function&nbsp;<code>edit<\/code>) still work, while many modern third-party blocks break.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is independent of any specific Lazy Edit \/ code-splitting feature in other plugins:\u00a0any block that registers a memoized\u00a0<code>edit<\/code>\u00a0is affected.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Requested fix<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Please change the wrapper so it always renders the original\u00a0<code>edit<\/code>\u00a0with\u00a0<code>createElement<\/code>\u00a0(or equivalent), for example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const OriginalEdit = settings.edit;<br \/><br \/>settings.edit = function ( props ) {<br \/>  \/\/ \u2026 your attribute initialization \u2026<br \/>  return wp.element.createElement( OriginalEdit, props );<br \/>};<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There is no need for the\u00a0<code>try { OriginalEdit(props) } catch { new OriginalEdit(props) }<\/code>\u00a0pattern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected result<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With Gutenberg Page &amp; Post Block Options enabled, third-party blocks that use&nbsp;<code>React.memo<\/code>&nbsp;(and similar) for&nbsp;<code>edit<\/code>&nbsp;should mount normally, the same as core blocks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I would appreciate it if you could confirm and ship a fix in an upcoming release. Happy to provide more details or test a patch if helpful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Thank you.<\/p>\n","protected":false},"template":"","class_list":["post-18995041","topic","type-topic","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/topic\/18995041","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/topic"}],"about":[{"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/types\/topic"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/topic\/18995041\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/media?parent=18995041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}