{"record":{"id":"ad5f15661d39a976","repo":"biomejs/biome","slug":"promise-interface-extends-clauses-are-not-supported","errorCode":null,"errorMessage":"Promise interface extends clauses are not supported","messagePattern":"Promise interface extends clauses are not supported","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"xtask/codegen/src/generate_global_types/lower.rs","lineNumber":959,"sourceCode":"                binding: LoweredFunctionParameterBinding::Pattern,\n                type_reference: LoweredTypeReference::Predefined(\"GLOBAL_VOID_CALLBACK_ID\"),\n                is_optional: false,\n                is_rest: false,\n            }]),\n            return_type: LoweredTypeReference::Predefined(\"GLOBAL_VOID_ID\"),\n        }),\n    });\n    for specification in PROMISE_METHOD_SPECIFICATIONS {\n        globals.push(promise_method_global(specification));\n    }\n\n    Ok(())\n}\n\n/// Requires each merged Promise declaration to use one unconstrained type parameter.\nfn validate_promise_interface(declaration: &TsInterfaceDeclaration) -> Result<()> {\n    if declaration.extends_clause().is_some() {\n        bail!(\"Promise interface extends clauses are not supported\");\n    }\n    single_type_parameter_name(declaration.type_parameters(), \"Promise interface\")?;\n    Ok(())\n}\n\n/// Checks selected methods while allowing overloads and unrelated declaration members.\nfn validate_promise_methods(\n    declaration: &TsInterfaceDeclaration,\n    location: PromiseMemberLocation,\n    saw_methods: &mut [bool; PROMISE_METHOD_COUNT],\n) -> Result<()> {\n    for member in declaration.members() {\n        match member {\n            AnyTsTypeMember::TsMethodSignatureTypeMember(method) => {\n                validate_selected_promise_method(&method, location, saw_methods)?;\n            }\n            AnyTsTypeMember::TsPropertySignatureTypeMember(property) => {\n                reject_selected_promise_non_method(property.name()?, location)?;","sourceCodeStart":941,"sourceCodeEnd":977,"githubUrl":"https://github.com/biomejs/biome/blob/3835945f0638c88162351318b7bc8b64c5f2fba7/xtask/codegen/src/generate_global_types/lower.rs#L941-L977","documentation":"validate_promise_interface requires the instance-side Promise interface to have no extends clause, since merged-inherited members would bypass the strict method validation. A Promise interface with a heritage clause aborts lowering with this error.","triggerScenarios":"Running codegen when lib sources contain `interface Promise<T> extends SomeBase<T> { ... }`.","commonSituations":"Lib updates adding heritage to Promise; merged vendor declarations that extend Promise to add helpers.","solutions":["Remove the extends clause and inline needed members into interface Promise<T>","Add extends-clause support to the Promise interface validation path","Pin lib sources to a version where Promise has no heritage clause"],"exampleFix":"// before\ninterface Promise<T> extends PromiseLike<T> { ... }\n// after\ninterface Promise<T> { /* PromiseLike members inlined */ ... }","handlingStrategy":"validation","validationCode":"if (promiseDecl.extendsClause) {\n  throw new Error(\"interface Promise<T> must not extend anything; inline the inherited members\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Avoid heritage clauses on Promise in snapshots","Inline helper members when merging vendor extensions","Audit interface heritage during snapshot review"],"tags":["codegen","build-time","interfaces"],"backgroundTag":"unsupported-operation","analyzedSha":"3835945f0638c88162351318b7bc8b64c5f2fba7","analyzedAt":"2026-09-13T15:11:16.919Z","contentChangedAt":"2026-09-13T15:11:16.919Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}