diff --git a/tsc/internal/checker/checker.go b/tsc/internal/checker/checker.go index ca77e97af8547..aacdd25bd4959 100644 --- a/tsc/internal/checker/checker.go +++ b/tsc/internal/checker/checker.go @@ -9373,7 +9373,7 @@ func (c *Checker) getLegacyDecoratorArgumentCount(node *ast.Node, signature *Sig return 2 case ast.KindMethodDeclaration, ast.KindGetAccessor, ast.KindSetAccessor: // For decorators with only two parameters we supply only two arguments - if len(signature.parameters) <= 2 { + if c.getParameterCount(signature) <= 2 { return 2 } return 3 diff --git a/tsc/testdata/baselines/reference/compiler/decoratorRestNoCrash1.errors.txt b/tsc/testdata/baselines/reference/compiler/decoratorRestNoCrash1.errors.txt new file mode 100644 index 0000000000000..f121edba4634f --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/decoratorRestNoCrash1.errors.txt @@ -0,0 +1,15 @@ +decoratorRestNoCrash1.ts(4,29): error TS2339: Property 'greeting' does not exist on type 'Greeter'. + + +==== decoratorRestNoCrash1.ts (1 errors) ==== + class Greeter { + @deco + greet1() { + return "Hello, " + this.greeting; + ~~~~~~~~ +!!! error TS2339: Property 'greeting' does not exist on type 'Greeter'. + } + } + + declare function deco(...args: [any, any, any]): any; + \ No newline at end of file diff --git a/tsc/testdata/baselines/reference/compiler/decoratorRestNoCrash1.symbols b/tsc/testdata/baselines/reference/compiler/decoratorRestNoCrash1.symbols new file mode 100644 index 0000000000000..ced9bfe5132cd --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/decoratorRestNoCrash1.symbols @@ -0,0 +1,21 @@ +//// [tests/cases/compiler/decoratorRestNoCrash1.ts] //// + +=== decoratorRestNoCrash1.ts === +class Greeter { +>Greeter : Symbol(Greeter, Decl(decoratorRestNoCrash1.ts, 0, 0)) + + @deco +>deco : Symbol(deco, Decl(decoratorRestNoCrash1.ts, 5, 1)) + + greet1() { +>greet1 : Symbol(Greeter.greet1, Decl(decoratorRestNoCrash1.ts, 0, 15)) + + return "Hello, " + this.greeting; +>this : Symbol(Greeter, Decl(decoratorRestNoCrash1.ts, 0, 0)) + } +} + +declare function deco(...args: [any, any, any]): any; +>deco : Symbol(deco, Decl(decoratorRestNoCrash1.ts, 5, 1)) +>args : Symbol(args, Decl(decoratorRestNoCrash1.ts, 7, 22)) + diff --git a/tsc/testdata/baselines/reference/compiler/decoratorRestNoCrash1.types b/tsc/testdata/baselines/reference/compiler/decoratorRestNoCrash1.types new file mode 100644 index 0000000000000..8c23e13f2b783 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/decoratorRestNoCrash1.types @@ -0,0 +1,25 @@ +//// [tests/cases/compiler/decoratorRestNoCrash1.ts] //// + +=== decoratorRestNoCrash1.ts === +class Greeter { +>Greeter : Greeter + + @deco +>deco : (args_0: any, args_1: any, args_2: any) => any + + greet1() { +>greet1 : () => string + + return "Hello, " + this.greeting; +>"Hello, " + this.greeting : string +>"Hello, " : "Hello, " +>this.greeting : any +>this : this +>greeting : any + } +} + +declare function deco(...args: [any, any, any]): any; +>deco : (args_0: any, args_1: any, args_2: any) => any +>args : [any, any, any] + diff --git a/tsc/testdata/tests/cases/compiler/decoratorRestNoCrash1.ts b/tsc/testdata/tests/cases/compiler/decoratorRestNoCrash1.ts new file mode 100644 index 0000000000000..c7f0bb76d7ab1 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/decoratorRestNoCrash1.ts @@ -0,0 +1,12 @@ +// @strict: true +// @noEmit: true +// @experimentalDecorators: true + +class Greeter { + @deco + greet1() { + return "Hello, " + this.greeting; + } +} + +declare function deco(...args: [any, any, any]): any;