{"record":{"id":"1341fd73d6edad81","repo":"denoland/deno","slug":"illegal-constructor-1341fd","errorCode":null,"errorMessage":"Illegal constructor","messagePattern":"Illegal constructor","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"ext/web/03_abort_signal.js","lineNumber":225,"sourceCode":"\n    // release strong references from source signals now that abort has been delivered\n    if (this[sourceSignals] !== null) {\n      for (const weakRef of new SafeSetIterator(this[sourceSignals])) {\n        const sourceSignal = WeakRefPrototypeDeref(weakRef);\n        if (sourceSignal !== undefined && sourceSignal[activeDependents]) {\n          SetPrototypeDelete(sourceSignal[activeDependents], this);\n        }\n      }\n    }\n  }\n\n  [remove](algorithm) {\n    this[abortAlgos] && SetPrototypeDelete(this[abortAlgos], algorithm);\n  }\n\n  constructor(key = null) {\n    if (key !== illegalConstructorKey) {\n      throw new TypeError(\"Illegal constructor\");\n    }\n    super();\n  }\n\n  get aborted() {\n    webidl.assertBranded(this, AbortSignalPrototype);\n    return this[abortReason] !== undefined;\n  }\n\n  get reason() {\n    webidl.assertBranded(this, AbortSignalPrototype);\n    return this[abortReason];\n  }\n\n  throwIfAborted() {\n    webidl.assertBranded(this, AbortSignalPrototype);\n    if (this[abortReason] !== undefined) {\n      throw this[abortReason];","sourceCodeStart":207,"sourceCodeEnd":243,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/ext/web/03_abort_signal.js#L207-L243","documentation":"AbortSignal's constructor is gated by an internal illegalConstructorKey symbol (ext/web/03_abort_signal.js:225-229): new AbortSignal() (or instantiating a subclass, since the default key parameter never matches) throws TypeError 'Illegal constructor'. Signals are meant to come from factories — new AbortController().signal, AbortSignal.timeout(), AbortSignal.abort(), AbortSignal.any() — and the assertBranded getters pair with this guard to keep internal slots unforgeable.","triggerScenarios":"new AbortSignal(); class TimedSignal extends AbortSignal {} followed by new TimedSignal(); Reflect.construct(AbortSignal, []).","commonSituations":"TypeScript users writing new AbortSignal() as a placeholder; test helpers trying to fabricate pre-aborted signals; copy-pasted snippets that assume a constructible signal; polyfills from other runtimes where signals were emulated with classes.","solutions":["Create signals via factories: new AbortController().signal for controllable signals, AbortSignal.timeout(ms) for deadlines, AbortSignal.abort(reason) for pre-aborted, AbortSignal.any([...]) for composition.","Type variables as AbortSignal and construct them only through these APIs.","Do not subclass AbortSignal — compose behavior with AbortSignal.any or by listening to abort events."],"exampleFix":"// before\nconst signal = new AbortSignal(); // TypeError: Illegal constructor\n\n// after\nconst signal = AbortSignal.timeout(5_000); // or new AbortController().signal","handlingStrategy":"fallback","validationCode":"const signal = opts?.signal instanceof AbortSignal\n  ? opts.signal\n  : AbortSignal.any([AbortSignal.timeout(5_000)]);","typeGuard":"const isAbortSignal = (v) => v instanceof AbortSignal;","tryCatchPattern":null,"preventionTips":["Build signals only via new AbortController().signal, AbortSignal.timeout(), AbortSignal.abort(), AbortSignal.any()","Type variables as AbortSignal, never construct them","Do not subclass AbortSignal"],"tags":["abortsignal","abortcontroller","constructor"],"backgroundTag":"illegal-constructor","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","contentChangedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}