Repository: TypeScript
Issue: Empty intersections as function return types are not treated as `never`
Labels: Suggestion,Experience Enhancement

# Bug Report

<!--
  Please fill in each section completely. Thank you!
-->

### 🔎 Search Terms

empty intersections, never, return type

### 🕗 Version & Regression Information

<!-- When did you start seeing this bug occur?

"Bugs" that have existed in TS for a long time are very likely to be FAQs; refer to
  https://github.com/Microsoft/TypeScript/wiki/FAQ#common-bugs-that-arent-bugs

If possible, please try testing the nightly version of TS to see if it's already been fixed.
For npm: `typescript@next`
This is also the 'Nightly' version in the playground: http://www.typescriptlang.org/play/?ts=Nightly

Note: The TypeScript Playground can be used to try older versions of TypeScript.

Please keep and fill in the line that best applies:
-->
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about types.

### ⏯ Playground Link

[strictNullChecks: false](https://www.typescriptlang.org/play?strict=false&noImplicitAny=false&strictNullChecks=false&strictFunctionTypes=false&strictPropertyInitialization=false&strictBindCallApply=false&noImplicitThis=false&noImplicitReturns=false&alwaysStrict=false&ts=4.6.0-dev.20220116#code/C4TwDgpgBAglC8UDeUwC4oCIaagXwG4AoUSKAIQWVQ03N0JPGgGEq4AyC4ogMwFcAdgGNgASwD2gqLwCMACgCUGQRABuEAE7IiUKJojB+mwcTxE+Q0ZOm8ATEoycKOvQaMmzFgSPFSoAOYKylCqGtpI5pa+NoEOIc6UkUA)

[strictNullChecks: true](https://www.typescriptlang.org/play?strict=false&noImplicitAny=false&strictFunctionTypes=false&strictPropertyInitialization=false&strictBindCallApply=false&noImplicitThis=false&noImplicitReturns=false&alwaysStrict=false&ts=4.6.0-dev.20220116#code/C4TwDgpgBAglC8UDeUwC4oCIaagXwG4AoUSKAIQWVQ03N0JPGgGEq4AyC4ogMwFcAdgGNgASwD2gqLwCMACgCUGQRABuEAE7IiUKJojB+mwcTxE+Q0ZOm8ATEoycKOvQaMmzFgSPFSoAOYKylCqGtpI5pa+NoEOIc6UkUA)

<!--
  A link to a TypeScript Playground "Share" link which shows this behavior

  The TypeScript Workbench can be used for more complex setups, try
  https://www.typescriptlang.org/dev/bug-workbench/

  As a last resort, you can link to a repo, but these will be slower for us to investigate.
-->

### 💻 Code

<!-- Please post the relevant code sample here as well-->
```ts
type A = { p: "A" };
type B = { p: "B" };

function f1(): never {
  return;
}

function f2(): A & B {
  return;
}

function g1(): never {}

function g2(): A & B {}
```

### 🙁 Actual behavior

f1: `Type 'undefined' is not assignable to type 'never'.` (expected)
f2 w/ `strictNullChecks: false`: no error emitted
f2 w/ `strictNullChecks: true`: `Type 'undefined' is not assignable to type 'never'.
  The intersection 'A & B' was reduced to 'never' because property 'p' has conflicting types in some constituents.` (expected)

g1: `A function returning 'never' cannot have a reachable end point.` (expected)
g2: `A function whose declared type is neither 'void' nor 'any' must return a value.`

### 🙂 Expected behavior

`f2` and `g2` should generate the same errors as `f1` and `g1` respectively other than elaboration on empty intersection types.

Note: I was suggested to separate fix from #47751 and I'm ready to submit another PR if this is really a bug.