ウェブサイト検索

node.js - TypeScriptで列挙型を使用し、各列挙値にメソッドを持たせる


私はこのTypeScriptファイルを持っています:

export type TSumanToString = () => string;

export interface ISumanEvent {
  explanation: string,
  toString: TSumanToString
}

export interface ISumanEvents{
  [key: string]: ISumanEvent
}

export const events: ISumanEvents = Object.freeze({

  // runner events
  TEST_FILE_CHILD_PROCESS_EXITED: {
    explanation: 'runner is started, fires before any test child processes are started.',
    toString: makeToString('TEST_FILE_CHILD_PROCESS_EXITED')
  },

  RUNNER_EXIT_CODE: {
    explanation: 'runner is started, fires before any test child processes are started.',
    toString: makeToString('RUNNER_EXIT_CODE')
  },

  RUNNER_EXIT_SIGNAL: {
    explanation: 'runner is started, fires before any test child processes are started.',
    toString: makeToString('RUNNER_EXIT_SIGNAL')
  },

  RUNNER_HIT_DIRECTORY_BUT_NOT_RECURSIVE: {
    explanation: 'runner is started, fires before any test child processes are started.',
    toString: makeToString('RUNNER_HIT_DIRECTORY_BUT_NOT_RECURSIVE')
  },

  RUNNER_EXIT_CODE_IS_ZERO: {
    explanation: 'runner is started, fires before any test child processes are started.',
    toString: makeToString('RUNNER_EXIT_CODE_IS_ZERO')
  },

  RUNNER_TEST_PATHS_CONFIRMATION: {
    explanation: 'runner is started, fires before any test child processes are started.',
    toString: makeToString('RUNNER_TEST_PATHS_CONFIRMATION')
  },

  // there are a lot more entries

})

これは次のような .d.ts ファイルを生成します:

export declare type TSumanToString = () => string;
export interface ISumanEvent {
    explanation: string;
    toString: TSumanToString;
}
export interface ISumanEvents {
    [key: string]: ISumanEvent;
}
export declare const events: ISumanEvents;

しかし、私はイベントの各プロパティを定数または列挙型として含める必要があります。インターフェースを使ってそれを行うこともできますが、その場合はすべてを重複させる必要があり、それは無駄のように思えます。

言い換えれば、私はこれをやりたくないです。なぜなら、これは単に私の定数にあるものを複製するだけで、無駄になり、簡単に同期が取れなくなる可能性があるからです。

export interface ISumanEvents {

  TEST_FILE_CHILD_PROCESS_EXITED: ISumanEvent,
  RUNNER_EXIT_CODE: ISumanEvent,
  RUNNER_EXIT_SIGNAL: ISumanEvent,
  RUNNER_HIT_DIRECTORY_BUT_NOT_RECURSIVE: ISumanEvent;
  RUNNER_EXIT_CODE_IS_ZERO: ISumanEvent,
  RUNNER_TEST_PATHS_CONFIRMATION: ISumanEvent

}

実際のオブジェクトのすべてを単に複製するインターフェースを作成せずに、enumを作成する方法はありますか?

問題は、列挙型にメソッドを定義する方法がわからないことです。

回答 #1

組み込みのTypeScriptのenumを使えない理由はありますか?

http://www.typescriptlang.org/docs/handbook/enums.html

関連記事