From fcc2d22cf527fda94503d92d1cc17cf858e8348b Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 9 Mar 2019 06:55:14 -0800 Subject: [PATCH 1/2] Fix case where getParameterTypeAtPosition didn't return undefined for out of bounds --- src/compiler/checker.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ec544ea0950..6dfd7258605 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21770,9 +21770,14 @@ namespace ts { return getTypeOfParameter(signature.parameters[pos]); } if (signature.hasRestParameter) { + // We want to return the value undefined for an out of bounds parameter position, + // so we need to check bounds here before calling getIndexedAccessType (which + // otherwise would return the type 'undefined'). const restType = getTypeOfSymbol(signature.parameters[paramCount]); - const indexType = getLiteralType(pos - paramCount); - return getIndexedAccessType(restType, indexType); + const index = pos - paramCount; + if (!isTupleType(restType) || restType.target.hasRestElement || index < (restType.typeArguments || emptyArray).length) { + return getIndexedAccessType(restType, getLiteralType(index)); + } } return undefined; } From 91996b1901cd7e1cca5e6a99cc7c33647279c6b0 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 9 Mar 2019 13:07:07 -0800 Subject: [PATCH 2/2] Accept new baselines --- .../getParameterNameAtPosition.errors.txt | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 tests/baselines/reference/getParameterNameAtPosition.errors.txt diff --git a/tests/baselines/reference/getParameterNameAtPosition.errors.txt b/tests/baselines/reference/getParameterNameAtPosition.errors.txt deleted file mode 100644 index 74a31fd3def..00000000000 --- a/tests/baselines/reference/getParameterNameAtPosition.errors.txt +++ /dev/null @@ -1,20 +0,0 @@ -tests/cases/compiler/getParameterNameAtPosition.ts(9,7): error TS2345: Argument of type 'Mock<[any]>' is not assignable to parameter of type 'Tester'. - Types of parameters 'args_1' and 'done' are incompatible. - Type '(...args: any[]) => any' is not assignable to type 'undefined'. - - -==== tests/cases/compiler/getParameterNameAtPosition.ts (1 errors) ==== - // Repro from #30171 - - interface Mock extends Function { - (...args: Y): any; - } - type Tester = (opts: any, done: (...args: any[]) => any) => any; - declare function cases(tester: Tester): void; - declare function fn(implementation?: (...args: Y) => any): Mock; - cases(fn(opts => { })); - ~~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type 'Mock<[any]>' is not assignable to parameter of type 'Tester'. -!!! error TS2345: Types of parameters 'args_1' and 'done' are incompatible. -!!! error TS2345: Type '(...args: any[]) => any' is not assignable to type 'undefined'. - \ No newline at end of file