{"record":{"id":"1413feb3913a5761","repo":"angular/angular-cli","slug":"target-name-must-be-a-string","errorCode":null,"errorMessage":"Target name must be a string.","messagePattern":"Target name must be a string\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/angular_devkit/core/src/workspace/definitions.ts","lineNumber":248,"sourceCode":"      defaultConfiguration: definition.defaultConfiguration,\n    };\n\n    super.set(definition.name, target);\n\n    return target;\n  }\n\n  override set(name: string, value: TargetDefinition): this {\n    this._validateName(name);\n\n    super.set(name, value);\n\n    return this;\n  }\n\n  private _validateName(name: string): void {\n    if (typeof name !== 'string') {\n      throw new TypeError('Target name must be a string.');\n    }\n  }\n}\n","sourceCodeStart":230,"sourceCodeEnd":252,"githubUrl":"https://github.com/angular/angular-cli/blob/bb72145f9ab45aee29f523236b3a25cd0813a841/packages/angular_devkit/core/src/workspace/definitions.ts#L230-L252","documentation":"TargetDefinitionCollection._validateName only checks that a target's name is a string; unlike project names there is no pattern restriction. If name is not a string (undefined, number, object), a TypeError is thrown before the target is created.","triggerScenarios":"addTarget({ name: undefined, ... }) from a destructured/missing variable; calling set() with a numeric or object key coerced through the API; passing name from untyped JS code.","commonSituations":"JavaScript (untyped) tooling building targets dynamically; missing object property in a config-driven generator; typos like { Name: 'build' } leaving name undefined.","solutions":["Ensure the target name is a non-empty string before calling addTarget/set.","Default or compute the name when it comes from user config (e.g. name ?? 'build').","Add a typeof name === 'string' check in generating code that passes dynamic names."],"exampleFix":"// before\nproject.addTarget({ name: cfg.targetName, builder: '...' }); // cfg.targetName may be undefined\n// after\nproject.addTarget({ name: String(cfg.targetName ?? 'build'), builder: '...' });","handlingStrategy":"type-guard","validationCode":"if (typeof targetName !== 'string') {\n  throw new Error(`Target name must be a string, got ${typeof targetName}`);\n}\nproject.addTarget({ name: targetName, builder });","typeGuard":"function isTargetName(v: unknown): v is string {\n  return typeof v === 'string' && v.length > 0;\n}","tryCatchPattern":"try {\n  project.addTarget({ name, builder });\n} catch (e) {\n  if (e instanceof TypeError && e.message === 'Target name must be a string.') {\n    project.addTarget({ name: String(name), builder });\n  } else throw e;\n}","preventionTips":["Type definitions as { name: string } in TS and compile with strict mode","Coerce user/config-provided names with String(name) and validate non-empty","Check for typos in config keys that leave name undefined"],"tags":["workspace","typeerror","targets","angular-devkit"],"backgroundTag":"invalid-argument-type","analyzedSha":"bb72145f9ab45aee29f523236b3a25cd0813a841","analyzedAt":"2026-08-30T02:47:34.745Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}