{"record":{"id":"9c49023869abbc77","repo":"gatsbyjs/gatsby","slug":"type-typename-declared-in-createtypes-looks","errorCode":null,"errorMessage":"Type `${typeName}` declared in `createTypes` looks like a node, but doesn't implement a `Node` interface. It's likely that you should add the `Node` interface to your type def:\n\n`type ${typeName} implements Node { ... }`\n\nIf you know that you don't want it to be a node (which would mean no root queries to retrieve it), you can explicitly disable inference for it:\n\n`type ${typeName} @dontInfer { ... }`","messagePattern":"Type `(.+?)` declared in `createTypes` looks like a node, but doesn't implement a `Node` interface\\. It's likely that you should add the `Node` interface to your type def:\n\n`type (.+?) implements Node (.+?)`\n\nIf you know that you don't want it to be a node \\(which would mean no root queries to retrieve it\\), you can explicitly disable inference for it:\n\n`type (.+?) @dontInfer (.+?)`","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/gatsby/src/schema/infer/index.js","lineNumber":50,"sourceCode":"        ? typeComposer.getExtension(`infer`)\n        : true\n      if (runInfer) {\n        if (!typeComposer.hasInterface(`Node`)) {\n          noNodeInterfaceTypes.push(typeName)\n        }\n        typesToInfer.push(typeComposer)\n      }\n    } else {\n      typeComposer = ObjectTypeComposer.create(typeName, schemaComposer)\n      addNodeInterface({ schemaComposer, typeComposer })\n      typeComposer.setExtension(`createdFrom`, `inference`)\n      typesToInfer.push(typeComposer)\n    }\n  })\n\n  if (noNodeInterfaceTypes.length > 0) {\n    noNodeInterfaceTypes.forEach(typeName => {\n      report.warn(\n        `Type \\`${typeName}\\` declared in \\`createTypes\\` looks like a node, ` +\n          `but doesn't implement a \\`Node\\` interface. It's likely that you should ` +\n          `add the \\`Node\\` interface to your type def:\\n\\n` +\n          `\\`type ${typeName} implements Node { ... }\\`\\n\\n` +\n          `If you know that you don't want it to be a node (which would mean no ` +\n          `root queries to retrieve it), you can explicitly disable inference ` +\n          `for it:\\n\\n` +\n          `\\`type ${typeName} @dontInfer { ... }\\``\n      )\n    })\n    report.panic(`Building schema failed`)\n  }\n\n  return typesToInfer.map(typeComposer =>\n    addInferredType({\n      schemaComposer,\n      typeComposer,\n      typeConflictReporter,","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/gatsbyjs/gatsby/blob/e85d62f1779e353eaac1753211629a26d123e26c/packages/gatsby/src/schema/infer/index.js#L32-L68","documentation":"Error \"Type `${typeName}` declared in `createTypes` looks like a node, but doesn't implement a `Node` interface. It's likely that you should add the `Node` interface to your type def:\n\n`type ${typeName} implements Node { ... }`\n\nIf you know that you don't want it to be a node (which would mean no root queries to retrieve it), you can explicitly disable inference for it:\n\n`type ${typeName} @dontInfer { ... }`\" thrown in gatsbyjs/gatsby.","triggerScenarios":"Thrown at packages/gatsby/src/schema/infer/index.js:50 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Add the Node interface to the type definition, e.g. `type MyType implements Node { ... }` in createTypes","If the type intentionally should not be a node, disable inference with the `@dontInfer` directive, e.g. `type MyType @dontInfer { ... }`","Check for typos in the type name given to createTypes so the intended node type is actually defined"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"e85d62f1779e353eaac1753211629a26d123e26c","analyzedAt":"2026-08-26T17:50:09.662Z","contentChangedAt":"2026-08-26T17:50:09.662Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}