web-dev-qa-db-ja.com

TypeScriptのenumに値が存在するか確認してください

私はtype = 3という数字を受け取り、それがこのenumに存在するかどうかチェックしなければなりません:

export const MESSAGE_TYPE = {
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4,
};

私が見つけた最良の方法は、すべてのEnum値を配列として取得し、それにindexOfを使用することです。しかし、結果のコードはそれほど読みにくくなります。

if( -1 < _.values( MESSAGE_TYPE ).indexOf( _.toInteger( type ) ) ) {
    // do stuff ...
}

もっと簡単な方法はありますか?

74
Tim Schoch

あなたの質問には非常にシンプルで簡単な解決策があります。

var districtId = 210;

if (DistrictsEnum[districtId] != null) {

// Returns 'undefined' if the districtId not exists in the DistrictsEnum 
    model.handlingDistrictId = districtId;
}
7
Ester Or

TypeScriptを使用している場合は、 実際の列挙型 を使用できます。それからinを使ってそれをチェックすることができます。これはあなたのenumがconstでなく数値ベースである場合にのみ機能することに注意してください。

export enum MESSAGE_TYPE {
    INFO = 1,
    SUCCESS = 2,
    WARNING = 3,
    ERROR = 4,
};

var type = 3;

if (type in MESSAGE_TYPE) {

}

上記の列挙型をコンパイルすると、belowオブジェクトが生成されるので、これは機能します。

{
    '1': 'INFO',
    '2': 'SUCCESS',
    '3': 'WARNING',
    '4': 'ERROR',
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4
}
88
Saravana

これを文字列の列挙型で使用したい場合は、 https://www.typescriptlang.org/docs/handbook/release-notes/TypeScript-2)に従って、文字列の列挙型は逆マッピングされていないため、Object.values(ENUM).includes(ENUM.value)を使用する必要があります。 -4.html

Enum Vehicle {
    Car = 'car',
    Bike = 'bike',
    Truck = 'truck'
}

になります:

{
    Car: 'car',
    Bike: 'bike',
    Truck: 'truck'
}

だからあなたはただする必要があります:

if (Object.values(Vehicle).includes(Vehicle.car)) {
    // Do stuff here
}

Property 'values' does not exist on type 'ObjectConstructor'のエラーが表示された場合は、ES2017をターゲットにしていません。このtsconfig.json configを使うこともできます。

"compilerOptions": {
    "lib": ["es2017"]
}

または、任意のキャストを実行することもできます。

if ((<any>Object).values(Vehicle).includes(Vehicle.car)) {
    // Do stuff here
}
80
Xiv
export enum UserLevel {
  Staff = 0,
  Leader,
  Manager,
}

export enum Gender {
  None = "none",
  Male = "male",
  Female = "female",
}

ログでの違いの結果:

log(Object.keys(Gender))
=>
[ 'None', 'Male', 'Female' ]

log(Object.keys(UserLevel))
=>
[ '0', '1', '2', 'Staff', 'Leader', 'Manager' ]

解決策は、私たちは数字としてキーを削除する必要があります。

export class Util {
  static existValueInEnum(type: any, value: any): boolean {
    return Object.keys(type).filter(k => isNaN(Number(k))).filter(k => type[k] === value).length > 0;
  }
}

使用法

// For string value
if (!Util.existValueInEnum(Gender, "XYZ")) {
  //todo
}

//For number value, remember cast to Number using Number(val)
if (!Util.existValueInEnum(UserLevel, 0)) {
  //todo
}
2
Nhan Cao