-
Notifications
You must be signed in to change notification settings - Fork 13k
Description
Bug Report
π Search Terms
TS2611, declaration file, property getter
π Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about TS2611, declaration files, property getters
β― Playground Link
This can't be completely reproduced in the Playground because it requires two separate projects. One to produce a .d.ts and another to attempt (and fail) to use it.
π» Code
Complete and minimal code sample here: https://github.com/kring/ts2611-in-decl-files
You can reproduce it by cloning that repo and running npm install && npm run build
.
To recreate it manually, define two projects, a
and b
, and use project references to link them up. Project a
exports a class which is created by deriving from a class returned by a function, like this:
function functionReturningClass() {
return class ClassInsideFunction {
get r() {
return 7;
}
};
}
class Something extends functionReturningClass() {
override get r() {
return 8;
}
}
export default Something;
(The above is in https://github.com/kring/ts2611-in-decl-files/blob/main/a/something.ts)
Now if we add another module that uses this to the same project, then it works great:
import Something from "./something.js";
const d = new Something();
console.log(d.r);
(the above is in https://github.com/kring/ts2611-in-decl-files/blob/main/a/use-from-a.ts)
However, if we add identical code to another project that references this one, like this, then it no longer works anymore:
import Something from "../a/something.js";
const d = new Something();
console.log(d.r);
(the above is from https://github.com/kring/ts2611-in-decl-files/blob/main/b/use-from-b.ts)
π Actual behavior
TypeScript reports the following:
out/a/something.d.ts:7:9 - error TS2611: 'r' is defined as a property in class '{ readonly r: number; }', but is overridden here in 'Something' as an accessor.
7 get r(): number;
~
This happens because the generated .d.ts does in fact mix properties and accessors:
declare const Something_base: {
new (): {
readonly r: number;
};
};
declare class Something extends Something_base {
get r(): number;
}
export default Something;
As far as I can tell, this makes the generated .d.ts
file unusable.
π Expected behavior
I expected no compiler error, probably because the TS compiler emitted an accessor in Something_base
rather than a property. Or maybe because it didn't get hung on the mismatch in this scenario?
This was also previously observed here:
#41347 (comment)
Thank you for taking a look!