{"record":{"id":"18a3b8a3dfe17ee2","repo":"swc-project/swc","slug":"object-not-disposable","errorCode":null,"errorMessage":"Object not disposable.","messagePattern":"Object not disposable\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"crates/swc_ecma_transforms_base/src/helpers/generated/_ts_add_disposable_resource.rs","lineNumber":32,"sourceCode":"        }\n        var dispose, inner;\n        if (async) {\n            if (!Symbol.asyncDispose) {\n                throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n            }\n            dispose = value[Symbol.asyncDispose];\n        }\n        if (dispose === void 0) {\n            if (!Symbol.dispose) {\n                throw new TypeError(\"Symbol.dispose is not defined.\");\n            }\n            dispose = value[Symbol.dispose];\n            if (async) {\n                inner = dispose;\n            }\n        }\n        if (typeof dispose !== \"function\") {\n            throw new TypeError(\"Object not disposable.\");\n        }\n        if (inner) {\n            dispose = function() {\n                try {\n                    inner.call(this);\n                } catch (e) {\n                    return Promise.reject(e);\n                }\n            };\n        }\n        env.stack.push({ value: value, dispose: dispose, async: async });\n    } else if (async) {\n        env.stack.push({ async: true });\n    }\n    return value;\n}\n\"#,\n    #[cfg(feature = \"inline-helpers\")]","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_ecma_transforms_base/src/helpers/generated/_ts_add_disposable_resource.rs#L14-L50","documentation":"After resolving the disposal method from the resource (`value[Symbol.dispose]`, or `value[Symbol.asyncDispose]` for `await using`), `_ts_add_disposable_resource` verifies it is callable. If the resource is an object/function but the resolved method is missing or not a function, it throws `TypeError(\"Object not disposable.\")`.","triggerScenarios":"`using x = {};` or `using x = { [Symbol.dispose]: null };` — any non-null object or function whose `[Symbol.dispose]` (or async variant) is absent or non-callable.","commonSituations":"Forgetting to implement `[Symbol.dispose]` on a connection/wrapper class; using a string-keyed `dispose()` method instead of the symbol key; a mock/stub resource in tests that lacks the symbol method.","solutions":["Implement the symbol-keyed method: `class Conn { [Symbol.dispose]() { this.close(); } }`.","If wrapping third-party objects, build a disposable adapter: `{ [Symbol.dispose]: () => obj.close() }`.","Check `typeof res?.[Symbol.dispose] === 'function'` before the `using` statement."],"exampleFix":"// before\nclass TempDir { dispose() { rmSync(this.path); } }\nusing tmp = new TempDir(); // TypeError: Object not disposable.\n\n// after\nclass TempDir { [Symbol.dispose]() { rmSync(this.path); } }\nusing tmp = new TempDir();","handlingStrategy":"type-guard","validationCode":"// Check disposability before the `using` statement.\nconst isDisposable = (v, async = false) => {\n  if (v == null) return true;\n  if (typeof v !== 'object' && typeof v !== 'function') return false;\n  const m = v[async ? Symbol.asyncDispose : Symbol.dispose];\n  return typeof m === 'function';\n};\nconst res = open();\nif (!isDisposable(res)) res[Symbol.dispose] = () => res.close();","typeGuard":"const isDisposable = (v: unknown): v is Disposable =>\n  (typeof v === 'object' || typeof v === 'function') &&\n  v !== null &&\n  typeof (v as Disposable)[Symbol.dispose] === 'function';","tryCatchPattern":null,"preventionTips":["Implement `[Symbol.dispose]()` (symbol key, not a string method) on every resource class.","For third-party objects, attach `obj[Symbol.dispose] ??= () => obj.close()` once at acquisition.","TypeScript's `Disposable` interface (`using ... : Disposable`) makes missing methods a compile error."],"tags":["using-declaration","disposable","symbol-dispose","explicit-resource-management"],"backgroundTag":"dispose-not-a-function","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","contentChangedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}