-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Fix "isolatedDeclarations" QuickFix #59112
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
It's not quite clear to me if the duplicate identifier error itself is a bugβ assignments of initializers that aren't function expressions are allowed to merge with the existing sybol declaration during binding: https://www.typescriptlang.org/play/?noUnusedLocals=true&install-plugin=typescript-playground-link-shortener#code/CYUwxgNghgTiAEAzArgOzAFwJYHtVJxwAoBKALngDcctgBuAWAChRJYFUoBbEAZwAcoYBIkLwA3s3jSqseKmRcKUVAE9GTGbJhJUASVCpsiLCBjK1GrZTmJUAUQAe-OL165UF9cwC+zUTgAdApc8AC88ACMGijo2Hi6BiBGWCZmpBJ+TAGBdkkpaToReYbGpjAxhLkOzq7uCREZYQB8mRpAA |
After some discussion within the team, we decided that this is in fact a bug. In JS, this code makes function f() { }
f.m = () => 1 Which is a little questionable since But it's definitely a bad idea in TS where you can have namespaces, because it results in a duplicate 'declaration': function f() { }
declare namespace f {
export function m(): number
}
f.m = () => 1 both The narrow fix is to avoid binding Both fixes boil down to deleting or conditionalising code in bindPotentiallyNewExpandoMemberToNamespace. The wider fix should make sure to continue binding prototype assignments as methods, so an additional parameter is probably needed if that's the way we want to go. |
Hi @sandersn , I've been working on this issue and wanted to ask for clarification on your comment before moving further. To close this issue, the binding in The issue author wanted something like: function f(): void { }
f.m = () => 1; after the code fix to become something like: function f(): void { }
namespace f {
export var m = (): number => {
return 1;
};
} And the binding change suggested in your comment would remove the function f(): void { }
declare namespace f {
export var m: () => number;
}
f.m = () => 1; Where currently, there is a Does that sound about right or have I misunderstood? Thanks |
The codefix output is good enough as-is. In the following code (playground link), it works for export function ImportExcelProgressModal(): number {
return 12
}
export declare namespace ImportExcelProgressModal {
//Error (active) TS2300 (TS) Duplicate identifier 'show'.
export var show: () => boolean;
export var n: number
}
//Error (active) TS2300 (TS) Duplicate identifier 'show'.
ImportExcelProgressModal.show = (): boolean => {
return false;
};
ImportExcelProgressModal.n = 13 You just need to change the binder to treat function initialisers the same as other types. Right now they're treated as if they're a new method on This is how Corsa works already, I believe, so Strada should change to match -- this is the wider fix I was talking about above. |
π Search Terms
isolatedDeclarations quickfix TS9023
π Version & Regression Information
This is an error in the new QuickFix in TS 5.5 to enable isolatedDeclarations.
β― Playground Link
No response
π» Code
When activating isolatedDeclarations this code does not compile.
π Actual behavior
After executing the quick fix it produces code with two errors:
π Expected behavior
but this (sorter) code would work:
If
ImportExcelProgressModal
would have been exported asdefault
then this would be the solution:Additional information about the issue
No response
The text was updated successfully, but these errors were encountered: