microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
100.98k stars 12.48k forks source link

Const variables initialized with parenthesized arrow expression cannot get expando properties #46284

Open jcalz opened 3 years ago

jcalz commented 3 years ago

Bug Report

πŸ”Ž Search Terms

expando, property assignments, arrow expression, #26368, #44988, #42203

πŸ•— Version & Regression Information

⏯ Playground Link

Playground link with relevant code

πŸ’» Code

type DescribableFunction = {
    description: string;
    (someArg: number): boolean;
};

const ok: DescribableFunction = (x: number) => false;
ok.description = 'description';

const ko: DescribableFunction = ((x: number) => false); // error!
//    ~~ <-- Property 'description' is missing
ko.description = 'description';

πŸ™ Actual behavior

ko is not recognized as a function capable of having expando properties added to it, while ok is recognized as such.

πŸ™‚ Expected behavior

Both ok and ko should behave the same way and allow expando properties as implemented in #26368. I don't know if it's common or not to use parentheses in this situation, but it was surprising to me when I ran into this discrepancy. I see from #44988 and #42203 that sometimes parentheses will disrupt things, so this is presumably an unanticipated use case that may not be important enough for anyone to address.

andrewbranch commented 3 years ago

Is this a common syntactic pattern? In general we try to ignore parens in semantic analysis, but like, I wouldn’t expect a function-returning IIFE to work, so it seems like a bit of a gray area to me.

andrewbranch commented 3 years ago

Meh, going to call it a suggestion. If there’s evidence that this is causing confusion, I’m open to it.