Repository: TypeScript
Issue: Improve error position/range for arrow functions with expression body
Labels: Suggestion,Help Wanted,Domain: Error Messages,Experience Enhancement

### 🔍 Search Terms

- arrow function
- return type
- type error position/range

### ✅ Viability Checklist

- [X] This wouldn't be a breaking change in existing TypeScript/JavaScript code
- [X] This wouldn't change the runtime behavior of existing JavaScript code
- [X] This could be implemented without emitting different JS based on the types of the expressions
- [X] This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- [X] This isn't a request to add a new utility type: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- [X] This feature would agree with the rest of our Design Goals: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals

### ⭐ Suggestion

For arrow functions with an expression body, the position of the return type error could be adjusted so it doesn't cover the entire expression. This would make it easier to identify more meaningful type errors that exist within the expression.

### 📃 Motivating Example

Consider the following example where we're using the `pipe` function inside arrow functions and the `add` function is missing.

```ts
declare const pipe: <A, B, C>(a: A, ab: (a: A) => B, bc: (b: B) => C) => C;

// declare const add: (x: number) => (n: number) => number;
declare const identity: <T>(x: T) => T;

// Arrow function with block body
const f = (): number => {
  return pipe(1, add(1), identity);
};

// Arrow function with expression body
const g = (): number => pipe(1, add(1), identity);
```

Both of these arrow functions have two type errors:

- For the return value: Type 'unknown' is not assignable to type 'number'.
- Cannot find name 'add'.

The first type error can be fixed by addressing the second type error.

When the arrow function has a block body, these two error messages are highlighted separately:

<img width="280" alt="image" src="https://github.com/microsoft/TypeScript/assets/921609/de0a94cd-3b8f-4516-89ee-7fee1f3d4333">

However, when the arrow function has an expression body, the range of the return type error covers the entire expression:

<img width="377" alt="image" src="https://github.com/microsoft/TypeScript/assets/921609/ad15bd1d-dba9-46fd-8fc4-8aa78ce5079f">

This makes it very difficult to spot the inner type error for `Cannot find name 'add'`, especially in more advanced examples.

To help with this I was wondering if we could move the position of the return type so it doesn't cover the entire expression. Perhaps it could be positioned on the `=>` that appears immediately before the expression? This would be closer to the behaviour of arrow functions with body blocks.

Note this issue does not occur when we're not using the `pipe` function. I believe this is because TypeScript treats the return type of `add(1)` as `any`, whereas with `pipe` the type argument `B` will be inferred as `unknown` (which is desired in other cases).

```ts
const g2 = (): number => identity(add(1)(1));
```

<img width="332" alt="image" src="https://github.com/microsoft/TypeScript/assets/921609/ee3bd28c-1267-4954-94b5-740c7d4ffd50">


### 💻 Use Cases

See above.