Skip to content

Isolated declarations quick fix defaults to including renamed propertiesΒ #59547

Open
@MichaelMitchell-at

Description

@MichaelMitchell-at

πŸ”Ž Search Terms

isolated declarations quick fix rename ts2842 ts9007

πŸ•— Version & Regression Information

  • This is the behavior in every version I tried

⏯ Playground Link

https://www.typescriptlang.org/play/?isolatedDeclarations=true&ts=5.6.0-dev.20240807#code/KYDwDg9gTgLgBAMwK4DsDGMCWEWIBQCUcA3gFBwVxTAxJS5x57ECGAXHAEYC+HrHABm4EOANwiYAJnAC8APhLCAhAG5S3IA

πŸ’» Code

export function f() {
    return  (({a: b}: {a: 0}): void => {})!;
}

πŸ™ Actual behavior

Quick fix introduces a type error:

export function f(): ({ a: b }: { a: 0; }) => void {
//                         ~
//                         'b' is an unused renaming of 'a'. Did you intend to use it as a type annotation? (2842)
    return  (({a: b}: {a: 0}): void => {})!;
}

πŸ™‚ Expected behavior

export function f(): ({a}: { a: 0; }) => void {
    return  (({a: b}: {a: 0}): void => {})!;
}

Additional information about the issue

While the quick fix is consistent with the emitted declaration, it ideally wouldn't lead to another type error which can be avoided.
There are cases where it may make sense to preserve the renaming, most obviously

export function f(): ({ a: b }: { a: 0; }) => typeof b {
    return (({a: b}: {a: 0}): typeof b => b)!;
}

but also perhaps

export function f() {
    return  (({a: b}: {a: 0}, a: {}): void => {})!;
}

though, maybe surprisingly, this would currently this still result in ts(2842)

export function f(): ({ a: b }: { a: 0; }, a: {}) => void {
//                         ~
//                         'b' is an unused renaming of 'a'. Did you intend to use it as a type annotation? (2842)
    return  (({a: b}: {a: 0}, a: {}): void => {})!;
}

Perhaps this could be relaxed. While b is unused in the direct sense, it technically has value in that it avoids the naming collision between the as.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Help WantedYou can do thisPossible ImprovementThe current behavior isn't wrong, but it's possible to see that it might be better in some cases

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions