（Typescript）class の method名を取る際の定義の仕方による取得され方の違いの検証

## 検証：functionを代入して定義した場合と、callableなプロパティとして定義したクラスメソッドのアクセスのされ方の違いを検証するテスト
https://stackoverflow.com/questions/39544789/get-class-methods-in-typescript

ES6でクラスのメソッド名の配列を取得する場合、`Object.keys()` と`Object.property()` で取得のされ方が違う、という情報があったので、検証してみました。

```DemoGetPropertiesNameOfClass.ts
export class Parent{
    parentFunctionPropertyCallable = function():string{
        return 'called parent function property callable';
    }
    parentNotFuncitonPropertyCallable():string {
        return 'called parent function property callable';
    }
    parentNotFuncitonPropertyNotCallable:string = 'called parent function property not callable';
}

export class Child extends Parent {
    childFunctionPropertyCallable = function():string{
        return 'called child function property callable';
    }
    childNotFuncitonPropertyCallable():string {
        return 'called child function property callable';
    }
    childNotFuncitonPropertyNotCallable:string = 'called child function property not callable';

}

```
Childクラスのインスタンスの Object.keys と、 Object.getOwnPropertyNames の実行結果を比較したいと思います。


```DemoGetPropertiesNameOfClass.spec.ts
import {Parent, Child} from './../DateFormat/DemoGetPropertiesNameOfClass';

describe('Object.keysとObject.getOwnPropertyNamesを使って、functionを代入したクラスメソッドと、callabelなプロパティとして定義したクラスメソッドの違いを検証するテスト', () => {
  const child = new Child();
  const childKeys = JSON.stringify(Object.keys(child));
  const childPropertyNames = JSON.stringify(Object.getOwnPropertyNames(child));
  it('should be ', () => {
    expect(childKeys).toEqual('');
  });
  it('should be ', () => {
    expect(childPropertyNames).toEqual('');
  });
});
```

下記がJestでテストした結果です。

```テスト結果.txt
vagrant@homestead:~/code/laravel-jest-typescript-demo$ npm test DemoGetPropertiesNameOfClass.spec.ts

> @ test /home/vagrant/code/laravel-jest-typescript-demo
> jest "DemoGetPropertiesNameOfClass.spec.ts"

ts-jest[config] (WARN) TypeScript diagnostics (customize using `[jest-config].globals.ts-jest.diagnostics` option):
message TS151001: If you have issues related to imports, you should consider setting `esModuleInterop` to `true` in your TypeScript configuration file (usually `tsconfig.json`). See https://blogs.msdn.microsoft.com/typescript/2018/01/31/announcing-typescript-2-7/#easier-ecmascript-module-interoperability for more information.
 FAIL  resources/ts/tests/DemoGetPropertiesNameOfClass.spec.ts (33.503s)
  Object.keysとObject.getOwnPropertyNamesを使って、functionを代入したクラスメソッドと、callabelなプロパティとして定義したクラスメソッドの違いを検証するテスト
    ✕ should be  (26ms)
    ✕ should be  (4ms)

  ● Object.keysとObject.getOwnPropertyNamesを使って、functionを代入したクラスメソッドと、callabelなプロパティとして定義したクラスメソッドの違いを検証するテスト › should be

    expect(received).toEqual(expected) // deep equality

    Expected: ""
    Received: "[\"parentFunctionPropertyCallable\",\"parentNotFuncitonPropertyNotCallable\",\"childFunctionPropertyCallable\",\"childNotFuncitonPropertyNotCallable\"]"

       6 |   const childPropertyNames = JSON.stringify(Object.getOwnPropertyNames(child));
       7 |   it('should be ', () => {
    >  8 |     expect(childKeys).toEqual('');
         |                       ^
       9 |   });
      10 |   it('should be ', () => {
      11 |     expect(childPropertyNames).toEqual('');

      at Object.<anonymous> (resources/ts/tests/DemoGetPropertiesNameOfClass.spec.ts:8:23)

  ● Object.keysとObject.getOwnPropertyNamesを使って、functionを代入したクラスメソッドと、callabelなプロパティとして定義したクラスメソッドの違いを検証するテスト › should be

    expect(received).toEqual(expected) // deep equality

    Expected: ""
    Received: "[\"parentFunctionPropertyCallable\",\"parentNotFuncitonPropertyNotCallable\",\"childFunctionPropertyCallable\",\"childNotFuncitonPropertyNotCallable\"]"

       9 |   });
      10 |   it('should be ', () => {
    > 11 |     expect(childPropertyNames).toEqual('');
         |                                ^
      12 |   });
      13 | });

      at Object.<anonymous> (resources/ts/tests/DemoGetPropertiesNameOfClass.spec.ts:11:32)

Test Suites: 1 failed, 1 total
Tests:       2 failed, 2 total
Snapshots:   0 total
Time:        60.384s, estimated 95s
Ran all test suites matching /DemoGetPropertiesNameOfClass.spec.ts/i.
npm ERR! Test failed.  See above for more details.
```


## 結果：Object.keysとObject.getOwnPropertyNamesを使って、functionを代入したクラスメソッドと、callabelなプロパティとして定義したクラスメソッドの違いは無かった。
- Object.keys(new Child())の結果

[\"parentFunctionPropertyCallable\",\"parentNotFuncitonPropertyNotCallable\",\"childFunctionPropertyCallable\",\"childNotFuncitonPropertyNotCallable\"]


- Object.getOwnPropertyNames(new Child())の結果

[\"parentFunctionPropertyCallable\",\"parentNotFuncitonPropertyNotCallable\",\"childFunctionPropertyCallable\",\"childNotFuncitonPropertyNotCallable\"]

tsconfig.jsonの設定なのかもしれませんが、差異はありませんでした。

## 前提条件
- Typescript: 3.5.3
- Jest: 24.8.0

```tsconfig.json
{
    "compilerOptions": {
      "outDir": "./built/",
      "sourceMap": true,
      "strict": true,
      "noImplicitReturns": true,
      "noImplicitAny": true,
      "module": "es2015",
      "experimentalDecorators": true,
      "emitDecoratorMetadata": true,
      "moduleResolution": "node",
      "target": "es5",
      "lib": [
        "es2016",
        "dom"
      ]
    },
    "include": [
      "resources/ts/**/*"
    ]
  }
```

```jest.config.js
module.exports = {
    testRegex: 'resources/ts/tests/.*.spec.ts$',
    preset: 'ts-jest'
}
```