Repository: TypeScript
Issue: Instance member function becomes instance member property in mapped types
Labels: Needs Investigation

<!-- 🚨 STOP 🚨 𝗦𝗧𝗢𝗣 🚨 𝑺𝑻𝑶𝑷 🚨

Half of all issues filed here are duplicates, answered in the FAQ, or not appropriate for the bug tracker. Even if you think you've found a *bug*, please read the FAQ first, especially the Common "Bugs" That Aren't Bugs section!

Please help us by doing the following steps before logging an issue:
  * Search: https://github.com/Microsoft/TypeScript/search?type=Issues
  * Read the FAQ: https://github.com/Microsoft/TypeScript/wiki/FAQ

Please fill in the *entire* template below.
-->

<!--
Please try to reproduce the issue with the latest published version. It may have already been fixed.
For npm: `typescript@next`
This is also the 'Nightly' version in the playground: http://www.typescriptlang.org/play/?ts=Nightly
-->
**TypeScript Version:**  `4.0.0-dev.20200512`

<!-- Search terms you tried before logging this (so others can find this issue more easily) -->
**Search Terms:**
- instance member function becomes instance member property
- mixin property of exported class expression may not be private or protected

**Code**

```ts
export class Application {
  protected getState() {
    return 'starting';
  }

  component(componentCtor: typeof Object) {
    // mount the component
  }
}

// Ideally, I'd like to write `function repositoryMixin(superClass: typeof Application)`, but that
// triggers "property of exported class expression may not be private or protected"
export function repositoryMixin<T extends MixinTarget<Application>>(superClass: T) {
  return class extends superClass {
    component(componentCtor: typeof Object) {
      super.component(componentCtor);
      // register repositories contributed by the component
    }
  }
}

// helpers to work around TypeScript limitations related to mixins

export type Constructor<T extends object> = new (...args: any[]) => T;

export type MixinTarget<T extends object> = Constructor<
  {
    // Enumerate only public members to avoid the following compiler error:
    //   Property '(some-name)' of exported class expression
    //   may not be private or protected. ts(4094)
    [p in keyof T]: T[p];
  }
>;
```

**Expected behavior:**

The code compiles cleanly.

**Actual behavior:**

```
$  tsc mixin-bug.ts
mixin-bug.ts:13:5 - error TS2425: Class '{ component: (componentCtor: ObjectConstructor) => void; }' defines instance member property 'component', but extended class '(Anonymous class)' defines it as instance member function.

13     component(componentCtor: typeof Object) {
       ~~~~~~~~~

mixin-bug.ts:14:13 - error TS2340: Only public and protected methods of the base class are accessible via the 'super' keyword.

14       super.component(componentCtor);
               ~~~~~~~~~


Found 2 errors.
```

**Playground Link:** <!-- A link to a TypeScript Playground "Share" link which demonstrates this behavior -->

https://www.typescriptlang.org/play/?ts=Nightly#code/MYGwhgzhAECCAO8QEthgC7IPYDtoG8AoaaYLAW3lwFMd0AKMymugYXSwCcAuadAT3jUsAM2gB5AEYArasHQBKAsRLQA9GujksAVzp8AFtVIUqOWuhUBfQjcIi987Hk7UqEZB078AssgAeyDgAPAAq0NT+6LQAJjB+gTihYJwA5tTowQhIqBjOAHz59BA6Qpys4FC8oUpEJK7oOpx4oJAwkdE4cdAlZRVtyqomzOZ0jKYs6OxcvAJCohIycoqDQz2l1JwAdExmFuMjFtOcCgDcKkMa0K6pyBDRnNduWB5eyNQwZHScyJI60TFoJJ+IZjLtJhdoDYSDY7FcjCAyjAONAAO5cADW0BSui60FCgmoAGVgD94OhoChyJ48rgYK5wAC+FgtAEghBCIRIlROBS5sZWHT0JwdPIuGEIlFYjAsEt5PloABeaDmVHQehbTUpVIQXhgHD8ADaAF0lIqFaFzlz-Dy+YToAkgsk0hkJR1pdBZbJ5UroIKcPcRWLOMEVHVVFcAKI4HTkTYYYy4EAg+A6SQoYBaajkSSbZEssAANywyEB6CM0BEWBAICwqKCqWG8GQIE2EU4nBmkKuJAACp2ygJoAByeg4MBxhTDz1iblcJmtKCS+CuKDObuaEjkMAgnBYCm56Ar5CFhOex4r-fLagxLboCD0AAsAAYAJyPhSQw3waBBaAY6h+AWUJjWqb9jXOGFCHyc4gADy+YToAkgsk0hkJR1pdBZbJ5UroIKcPcRWLOMEVHVVFcAKI4HTkTYYYy4EAg+A6SQoYBaajkSSbZEssAANywyEB6CM0BEWBAICwqKCqWG8GQIE2EU4nBmkKuJAACp2ygJoAByeg4MBxhTDz1iblcJmtKCS+CuKDObuaEjkMAgnBYCm56Ar5CFhOex4r-fLagxLboCD0AAsAAYAJyPhSQw3waBBaAY6h+AWUJjWqb9jXOGFCHyc4gA

**Related Issues:** <!-- Did you find other bugs that looked similar? -->

- Remove property-override-method error #34494
- 3.7: instance member function becomes instance member property in type references [outcome: fixed since 3.7.0-dev.20191016] #33747
- Support for all type features in declaration files. #35822
- False error TS4094: ... exported class expression may not be private or protected. #30355
- Allow .d.ts files to represent anonymous class expressions with `private` members #36060
- Unexpected TS4094 with the build parameter `declaration: true`#17293
- Generating type definitions for mixin classes with protected members #17744