Dize değerleriyle bir numaralandırma oluşturma


262

Aşağıdaki kod bir enumTypeScript oluşturmak için kullanılabilir :

enum e {
    hello = 1,
    world = 2
};

Ve değerlere şu yolla erişilebilir:

e.hello;
e.world;

enumDize değerleriyle nasıl oluştururum ?

enum e {
    hello = "hello", // error: cannot convert string to e
    world = "world"  // error 
};

Yanıtlar:


409

TypeScript 2.4

Şimdi dize sıralamaları vardır, böylece kodunuz sadece çalışır:

enum E {
    hello = "hello",
    world = "world"
};

🌹

TypeScript 1.8

TypeScript 1.8'den beri, adlandırılmış dize değerleri için güvenilir ve güvenli bir deneyim sağlamak için dize değişmez türlerini kullanabilirsiniz (bu, kısmen numaralandırmaların ne için kullanıldığıdır).

type Options = "hello" | "world";
var foo: Options;
foo = "hello"; // Okay 
foo = "asdf"; // Error!

Daha fazlası: https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types

Miras yardımı

TypeScript'teki numaralandırmalar sayı tabanlıdır.

Yine de statik üyeleri olan bir sınıfı kullanabilirsiniz:

class E
{
    static hello = "hello";
    static world = "world"; 
}

Siz de sade olabilirsiniz:

var E = {
    hello: "hello",
    world: "world"
}

Güncelleme:var test:E = E.hello; Aşağıdaki gibi bir şey yapabilme gereksinimine dayanarak bunu karşılar:

class E
{
    // boilerplate 
    constructor(public value:string){    
    }

    toString(){
        return this.value;
    }

    // values 
    static hello = new E("hello");
    static world = new E("world");
}

// Sample usage: 
var first:E = E.hello;
var second:E = E.world;
var third:E = E.hello;

console.log("First value is: "+ first);
console.log(first===third); 

Küçük gelişme:toString(): string { return this.value; }
psulek

@psulek Aslında typescript, toStringbir dize döndürdüğünden this.valueve bir dize yazdığından bir dize döndürür value. Bu yüzden yapamazsınız var x:number = E.hello.toString();ve eğer var x = E.hello.toString();x yaparsanız da tipte stringolduğu
söylenir

2
@BASarat Bu daktilo böyle bir durum ele doğrudur, ama ben her zaman bildiğimiz zaman dönüş türleri ile dekore yöntemleri var demek, ts derleyici için bile gerekli değil, ama bizim için kodlayıcılar ne zaman yöntem tanımı gördüm bilmek döndürür yazın.
psulek

@basarat get()yöntemi değiştirmenin bir dezavantajı var return this.valuemı? Bu şekilde, yalnızca dönüştürürken değil, erişildiğinde dize değerini döndürür toString().
John

@basarat Eğer böyle "sayılar" varsa, derleyici yapısal yazım nedeniyle aralarında ayrım yapmayacaktır - derleyici valueher türden üyeyi görecek ve karşılaştırılabilir tür olarak ele alacaktır . valueYine de üyeyi özel yapabilirsin . Bu şekilde derleyici onu görmez ve yapısal yazmayı uygulamaya çalışmaz.
Kirill G.

113

TypeScript'in en son sürümünde (1.0RC), aşağıdaki gibi numaralandırmaları kullanabilirsiniz:

enum States {
    New,
    Active,
    Disabled
} 

// this will show message '0' which is number representation of enum member
alert(States.Active); 

// this will show message 'Disabled' as string representation of enum member
alert(States[States.Disabled]);

Güncelleme 1

Dize değerinden numaralandırma üyesinin sayı değerini almak için şunu kullanabilirsiniz:

var str = "Active";
// this will show message '1'
alert(States[str]);

Güncelleme 2

En son TypeScript 2.4'te, dize sıralamaları tanıtıldı, örneğin:

enum ActionType {
    AddUser = "ADD_USER",
    DeleteUser = "DELETE_USER",
    RenameUser = "RENAME_USER",

    // Aliases
    RemoveUser = DeleteUser,
}

TypeScript 2.4 hakkında daha fazla bilgi için MSDN'deki blogu okuyun .


2
Genellikle, bu çözüm tercih edilir (gerçek bir enum olduğu için), ancak enum adının ne olduğu konusunda çok kısıtlısınız (dolayısıyla 'dize').
JasonS

2
Bugün itibariyle en iyi çözüm.
Alon Amir

2
Bu konuda yeni bir şey var mı? Çünkü States[str]bugünlerde çalışmıyor. Type 'string' is not assignable to type 'States'
MrCroft

1
@MrCroft Dizginin States[str as any]geçerli (2.x) sürümünde yapmak için: kullanabilirsiniz .
psulek

Devletler [str] aradığım şeydi. Teşekkürler!
Martin Konicek

81

TypeScript 2.4+

Artık dize değerlerini doğrudan numaralandırma üyelerine atayabilirsiniz:

enum Season {
    Winter = "winter",
    Spring = "spring",
    Summer = "summer",
    Fall = "fall"
}

Daha fazla bilgi için # 15486'ya bakın .

TypeScript 1.8+

TypeScript 1.8+ sürümünde, türü tanımlamak için bir dize hazır bilgisi türü ve değerler listesi için aynı ada sahip bir nesne oluşturabilirsiniz. Bir string enum'un beklenen davranışını taklit eder.

İşte bir örnek:

type MyStringEnum = "member1" | "member2";

const MyStringEnum = {
    Member1: "member1" as MyStringEnum,
    Member2: "member2" as MyStringEnum
};

Hangi bir dize numaralandırma gibi çalışacaktır:

// implicit typing example
let myVariable = MyStringEnum.Member1; // ok
myVariable = "member2";                // ok
myVariable = "some other value";       // error, desired

// explict typing example
let myExplicitlyTypedVariable: MyStringEnum;
myExplicitlyTypedVariable = MyStringEnum.Member1; // ok
myExplicitlyTypedVariable = "member2";            // ok
myExplicitlyTypedVariable = "some other value";   // error, desired

Nesnedeki tüm dizeleri yazdığınızdan emin olun! Yukarıdaki ilk örnekte bunu yapmazsanız, değişken örtük olarak yazılmaz MyStringEnum.


1
Bir bildirim dosyasında benzer bir şeyi nasıl tanımlayabilirim?
Zev Spitz

Yapabileceğiniz @ZevSpitz bu
David Sherret

Mevcut derleyiciyle, MyStringEnum'daki dize değerlerini yanlış yazabileceğinizi ve şikayet etmeyeceğinizi belirtmek gerekir. Dizelerimin her zaman geçerli olduğundan emin olmak için bir 'Enforcer' arayüzü oluşturuyorum. Örneğin: interface MyStringEnumEnforcer {Üye1: MyStringEnum, Üye2: MyStringEnum} Daha sonra const MyStringEnum: MyStringEnumEnforcer = {Üye1: "üye1", Üye2: "üye2"} Bu derleyici yanlış yazılmış dizelere izin vermese de, orijinal senaryo sonunda. Bu yaklaşımla birçok tören var ama güvenliği seviyorum.
jmorc


40

TypeScript 0.9.0.1'de, bir derleyici hatası oluşmasına rağmen, derleyici yine de ts dosyasını js dosyasına derleyebilir. Kod beklediğimiz gibi çalışır ve Visual Studio 2012 otomatik kod tamamlamayı destekleyebilir.

Güncelleme :

Sözdiziminde, TypeScript dize değerleriyle bir numaralandırma oluşturmamıza izin vermez, ancak derleyiciyi hackleyebiliriz: p

enum Link
{
    LEARN   =   <any>'/Tutorial',
    PLAY    =   <any>'/Playground',
    GET_IT  =   <any>'/#Download',
    RUN_IT  =   <any>'/Samples',
    JOIN_IN =   <any>'/#Community'
}

alert('Link.LEARN:    '                     + Link.LEARN);
alert('Link.PLAY:    '                      + Link.PLAY);
alert('Link.GET_IT:    '                    + Link.GET_IT);
alert('Link[\'/Samples\']:    Link.'        + Link['/Samples']);
alert('Link[\'/#Community\']    Link.'      + Link['/#Community']);

Oyun alanı


1
Güzel bir hack, ama bu enum / sabitleri bir anahtar deyiminde kullanamazsınız, örneğin case Link.LEARN:bir Cannot convert 'Link.LEARN' to 'string'inşa hatası alırsınız . Döküm çalışmaz.
Gone Coding

@TrueBlueAussie TSC 1.0.0.0 çalıştıran benim için iyi çalışıyor gibi görünüyor. Ayrıca, herhangi bir nedenle case deyimine bir sabit / değişken dizesi koymanız gerekiyorsa, herhangi bir ifadeyi kullanırsanız çalışır.
CodeAndCats

1
Ayrıca, teşekkürler @ zjc0816, ben bu çözümü seviyorum freaking :)
CodeAndCats

İstediğim çözüm bu.
Murhaf Sousli

5
Komik, merak ediyorum TypeScript neden sadece enum dizelerini desteklemiyor ... Birçok insan bunu istiyor (ben dahil).
Hendy Irawan

23

TypeScript 2.1 +

TypeScript 2.1'de sunulan arama türleri , dize numaralandırmalarını simüle etmek için başka bir desene izin verir:

// String enums in TypeScript 2.1
const EntityType = {
    Foo: 'Foo' as 'Foo',
    Bar: 'Bar' as 'Bar'
};

function doIt(entity: keyof typeof EntityType) {
    // ...
}

EntityType.Foo          // 'Foo'
doIt(EntityType.Foo);   // 👍
doIt(EntityType.Bar);   // 👍
doIt('Foo');            // 👍
doIt('Bad');            // 🙁 

TypeScript 2.4 +

2.4 sürümünde, TypeScript dize sıralamaları için yerel destek sağladı, bu nedenle yukarıdaki çözüme gerek yoktur. TS belgelerinden:

enum Colors {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE",
}

Numaralandırma anahtar adı dize değerinden farklıysa (örneğin, çok uzun olduğu için) bunu nasıl yapabilirim?
CletusW

Boşver! @ Asukasz-pniewski'nin cevabının altında çözüldü stackoverflow.com/a/42820134/1431146
CletusW

tslint, Enum: Element'i dolaylı olarak eşlemeye çalışırken bu String-Enum örneğine bir hata atar, çünkü dizin ifadesi 'number' türünde değildir. Sorun TS dizesinde Enums ters harita olamaz olamaz sanırım, typescriptlang.org/docs/handbook/release-notes/… adresindeki String-Enum örneğinde açıklamaya bakın - Bu TS 2.4 için doğru gibi görünüyor String-Enum tanıtıldı ama TS 2.6.2 de hata alıyorum. Örnek: Colors["RED"]çalışmaz. Bunu nasıl çözeceğiniz hakkında herhangi bir fikir (JSON dönüşümü için gereklidir).
masi

19

Neden sadece bir numaralandırmanın dizelerine erişmenin yerel yolunu kullanmıyorsunuz?

enum e {
  WHY,
  NOT,
  USE,
  NATIVE
}

e[e.WHY] // this returns string 'WHY'

2
Aradığım cevap bu, teşekkürler! Diğer çözümler akıllı çözümler, ancak bu çok basit :)
M--

19
Bu soruya cevap vermiyor. Soru, bir enum dizelerine erişmekle ilgili değil. enum Why { Because = "You Can't", Always = "Do Things That Way." };)
James Wilkins

Sayısal değer sıralamaları kullanıldığında, örneğin 0 falsili, hata ayıklaması zor vb. Gibi sorunlar vardır
robmcm

@robmcm enum e {NEDEN = 1, NOT = 2, KULLANIM = 3, NATIVE = 4} e [e.WHY] // bu, 'NEDEN' dizesini döndürür
Mient-jan Stelling

16

Dize sıralarını en son TypeScript'te kullanabilirsiniz:

enum e
{
    hello = <any>"hello",
    world = <any>"world"
};

Kaynak: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/


GÜNCELLEME - 2016

Bu günlerde React için kullandığım bir dizi dizeyi oluşturmanın biraz daha sağlam bir yolu şöyle:

export class Messages
{
    static CouldNotValidateRequest: string = 'There was an error validating the request';
    static PasswordMustNotBeBlank: string = 'Password must not be blank';   
}

import {Messages as msg} from '../core/messages';
console.log(msg.PasswordMustNotBeBlank);

1
Bu benim için işi yapan en özlü yoldu ... En azından TS 1.8 ile derlemek için
iskelemi

Ancak bununla ilgili bir sorun, <string>e.hellobir hatayı tetiklemesidir. e.helloderleyici tarafından hala sayı olarak kabul edilmektedir. <number>e.helloolsa çalışır. Bunun etrafında bir yol var mı? Tek düşünebildiğim <string><any>e.hello.
RainingChain

Başka bir sorun da numaralandırma üyesi olması enum değerine eşittir. Örn:enum Test { a = <any>"b", b = <any>"c", c = <any>"a" } Test.a === 'c'
RainingChain

Bu yöntemi her zaman kullanıyorum. Dize enum's rock. Derleyicinin dize değişmezleri için birinci sınıf desteğe sahip olmaması hayal kırıklığı yaratıyor, ancak 2. sınıf desteğe sahip. Derleyici aslında bir .d.ts dosyasında kullanmanıza engel olacağı için <any> hackini ne zaman kullandığınızı bilir. ama tamamen durmuyor.
CodeAndCats

Btw, bir dize değeri dize enum değeri ile karşılaştırmak istiyorsanız, o zaman o zaman döküm yapmak <any>için <string>, sadece şunu yapın:someStringValue == someEnumValue.toString()
CodeAndCats 22:16

10

İşte TypeScript 2.0 kullanarak kalıtıma izin veren oldukça temiz bir çözüm. Bunu daha önceki bir sürümde denemedim.

Bonus: değer herhangi bir tip olabilir!

export class Enum<T> {
  public constructor(public readonly value: T) {}
  public toString() {
    return this.value.toString();
  }
}

export class PrimaryColor extends Enum<string> {
  public static readonly Red = new Enum('#FF0000');
  public static readonly Green = new Enum('#00FF00');
  public static readonly Blue = new Enum('#0000FF');
}

export class Color extends PrimaryColor {
  public static readonly White = new Enum('#FFFFFF');
  public static readonly Black = new Enum('#000000');
}

// Usage:

console.log(PrimaryColor.Red);
// Output: Enum { value: '#FF0000' }
console.log(Color.Red); // inherited!
// Output: Enum { value: '#FF0000' }
console.log(Color.Red.value); // we have to call .value to get the value.
// Output: #FF0000
console.log(Color.Red.toString()); // toString() works too.
// Output: #FF0000

class Thing {
  color: Color;
}

let thing: Thing = {
  color: Color.Red,
};

switch (thing.color) {
  case Color.Red: // ...
  case Color.White: // ...
}

1
Mükemmel cevap! Miras desteğiyle Enum benzeri bir nesne yapmak için uğraşıyordum.
DanielM

Sınıf tabanlı bir Enum kullanan bir örnek: goo.gl/SwH4zb (TypeScript oyun alanına bağlantı).
DanielM

8

Bunun hacky bir yolu: -

CallStatus.ts

enum Status
{
    PENDING_SCHEDULING,
    SCHEDULED,
    CANCELLED,
    COMPLETED,
    IN_PROGRESS,
    FAILED,
    POSTPONED
}

export = Status

Utils.ts

static getEnumString(enum:any, key:any):string
{
    return enum[enum[key]];
}

Nasıl kullanılır

Utils.getEnumString(Status, Status.COMPLETED); // = "COMPLETED"

7

Bu benim için çalışıyor:

class MyClass {
    static MyEnum: { Value1; Value2; Value3; }
    = {
        Value1: "Value1",
        Value2: "Value2",
        Value3: "Value3"
    };
}

veya

module MyModule {
    export var MyEnum: { Value1; Value2; Value3; }
    = {
        Value1: "Value1",
        Value2: "Value2",
        Value3: "Value3"
    };
}

8)

Güncelleme: Bunu gönderdikten kısa bir süre sonra başka bir yol keşfettim, ancak bir güncelleme yayınlamayı unuttum (ancak, birileri yukarıda bahsetti):

enum MyEnum {
    value1 = <any>"value1 ", 
    value2 = <any>"value2 ", 
    value3 = <any>"value3 " 
}

4

Ben sadece bir arayüz beyan ve bu tür bir değişken enum erişmek kullanın. Arabirim ve numaralandırmayı senkronize tutmak aslında kolaydır, çünkü TypeScript numarada bir şey değiştiğinde şikayet eder, örneğin.

hata TS2345: 'tipeof EAbFlagEnum' türünün bağımsız değişkeni 'IAbFlagEnum' türündeki parametreye atanamaz. 'Tür' EAbFlagEnum 'türünde' Move 'özelliği eksik.

Bu yöntemin avantajı, enumun (arayüz) çeşitli durumlarda kullanılması için tipte döküm gerekmemesi ve anahtar / kasa gibi daha fazla durumun desteklenmesidir.

// Declare a TypeScript enum using unique string 
//  (per hack mentioned by zjc0816)

enum EAbFlagEnum {
  None      = <any> "none",
  Select    = <any> "sel",
  Move      = <any> "mov",
  Edit      = <any> "edit",
  Sort      = <any> "sort",
  Clone     = <any> "clone"
}

// Create an interface that shadows the enum
//   and asserts that members are a type of any

interface IAbFlagEnum {
    None:   any;
    Select: any;
    Move:   any;
    Edit:   any;
    Sort:   any;
    Clone:  any;
}

// Export a variable of type interface that points to the enum

export var AbFlagEnum: IAbFlagEnum = EAbFlagEnum;

Enum yerine değişkenin kullanılması istenen sonuçları verir.

var strVal: string = AbFlagEnum.Edit;

switch (strVal) {
  case AbFlagEnum.Edit:
    break;
  case AbFlagEnum.Move:
    break;
  case AbFlagEnum.Clone
}

Bayraklar benim için başka bir zorunluluktu, bu yüzden bu örneğe eklenen ve testler içeren bir NPM modülü oluşturdum.

https://github.com/djabraham/ts-enum-tools


Tanımları ithalatla karıştırmaya izin veren bulduğum tek cevap bu. Güzel! export default EAbFlagEnum as IAbFlagEnum;Bir değişkeni yeniden bildirmek yerine kullanabilirsiniz . Ayrıca <any>numaralandırma kadroyu kaldırdım, iyi çalışıyor.
Guillaume

4

GÜNCELLEME: TypeScript 3.4

Sadece şunu kullanabilirsiniz as const:

const AwesomeType = {
   Foo: "foo",
   Bar: "bar"
} as const;

TypeScript 2.1

Bu da bu şekilde yapılabilir. Umarım birine yardım eder.

const AwesomeType = {
    Foo: "foo" as "foo",
    Bar: "bar" as "bar"
};

type AwesomeType = (typeof AwesomeType)[keyof typeof AwesomeType];

console.log(AwesomeType.Bar); // returns bar
console.log(AwesomeType.Foo); // returns foo

function doSth(awesometype: AwesomeType) {
    console.log(awesometype);
}

doSth("foo") // return foo
doSth("bar") // returns bar
doSth(AwesomeType.Bar) // returns bar
doSth(AwesomeType.Foo) // returns foo
doSth('error') // does not compile

Tam da ihtiyacım olan şey bu! Büyük / küçük harf farkınızla gösterdiğiniz gibi, anahtar adının dize değerinden farklı olmasını destekler. Teşekkürler!
CletusW

2

Sonraki yazı tipinde @ mevcut olan özel transformatörlerle ( https://github.com/Microsoft/TypeScript/pull/13940 ), dizgi değişmezi türlerinden dize değerlerine sahip dize benzeri bir nesne oluşturabilirsiniz.

Lütfen npm paketime bakın, ts-transformer-enumerate .

Örnek kullanım:

// The signature of `enumerate` here is `function enumerate<T extends string>(): { [K in T]: K };`
import { enumerate } from 'ts-transformer-enumerate';

type Colors = 'green' | 'yellow' | 'red';
const Colors = enumerate<Colors>();

console.log(Colors.green); // 'green'
console.log(Colors.yellow); // 'yellow'
console.log(Colors.red); // 'red'

2

Yazı Tipi <2.4

/** Utility function to create a K:V from a list of strings */
function strEnum<T extends string>(o: Array<T>): {[K in T]: K} {
  return o.reduce((res, key) => {
    res[key] = key;
    return res;
  }, Object.create(null));
}

/**
  * Sample create a string enum
  */

/** Create a K:V */
const Direction = strEnum([
  'North',
  'South',
  'East',
  'West'
])
/** Create a Type */
type Direction = keyof typeof Direction;

/** 
  * Sample using a string enum
  */
let sample: Direction;

sample = Direction.North; // Okay
sample = 'North'; // Okay
sample = 'AnythingElse'; // ERROR!

dan https://basarat.gitbooks.io/typescript/docs/types/literal-types.html

Kaynak bağlantıya dizgi değişmezi türünü gerçekleştirmenin daha ve daha kolay yollarını bulabilirsiniz


2

Çok fazla cevap var, ama tam bir çözüm göremiyorum. Kabul edilen yanıtın yanı sıra enum { this, one }, kullandığınız dize değerini birçok dosyada dağıtmasıdır. Ben de "güncelleme" gerçekten sevmiyorum, karmaşık ve türleri de kaldıraç yok. Michael Bromley'nin cevabı en doğru olduğunu düşünüyorum , ancak arayüzü biraz zor ve bir türle yapabilirdi.

TypeScript 2.0 kullanıyorum. * İşte yapacağım şey

export type Greeting = "hello" | "world";
export const Greeting : { hello: Greeting , world: Greeting } = {
    hello: "hello",
    world: "world"
};

let greet: Greeting = Greeting.hello

Ayrıca, yararlı bir IDE kullanırken çok daha hoş bir tip / fareyle üzerine gelme bilgisi vardır. Çekiliş, dizeleri iki kez yazmak zorundasınız, ancak en azından sadece iki yerde.


1

@ basarat'ın cevabı harikaydı. İşte basitleştirilmiş ama kullanabileceğiniz biraz genişletilmiş örnek:

export type TMyEnumType = 'value1'|'value2';

export class MyEnumType {
    static VALUE1: TMyEnumType = 'value1';
    static VALUE2: TMyEnumType = 'value2';
}

console.log(MyEnumType.VALUE1); // 'value1'

const variable = MyEnumType.VALUE2; // it has the string value 'value2'

switch (variable) {
    case MyEnumType.VALUE1:
        // code...

    case MyEnumType.VALUE2:
        // code...
}

1

Son zamanlarda TypeScript 1.0.1 ile bu sorunla karşılaştı ve şu şekilde çözüldü:

enum IEvents {
        /** A click on a product or product link for one or more products. */
        CLICK,
        /** A view of product details. */
        DETAIL,
        /** Adding one or more products to a shopping cart. */
        ADD,
        /** Remove one or more products from a shopping cart. */
        REMOVE,
        /** Initiating the checkout process for one or more products. */
        CHECKOUT,
        /** Sending the option value for a given checkout step. */
        CHECKOUT_OPTION,
        /** The sale of one or more products. */
        PURCHASE,
        /** The refund of one or more products. */
        REFUND,
        /** A click on an internal promotion. */
        PROMO_CLICK
}

var Events = [
        'click',
        'detail',
        'add',
        'remove',
        'checkout',
        'checkout_option',
        'purchase',
        'refund',
        'promo_click'
];

function stuff(event: IEvents):boolean {
        // event can now be only IEvents constants
        Events[event]; // event is actually a number that matches the index of the array
}
// stuff('click') won't work, it needs to be called using stuff(IEvents.CLICK)

0

Ben bunu denemek gerektiğini düşünüyorum, bu durumda değişkenin değeri değişmez ve enums gibi çalışır, bir sınıf gibi kullanmak da tek dezavantajı yanlışlıkla statik değişkenin değerini değiştirebilirsiniz ve bu ne numaralandırmada istemiyoruz.

namespace portal {

export namespace storageNames {

    export const appRegistration = 'appRegistration';
    export const accessToken = 'access_token';

  }
}

0
export enum PaymentType {
                Cash = 1,
                Credit = 2
            }
var paymentType = PaymentType[PaymentType.Cash];

0
//to access the enum with its string value you can convert it to object 
//then you can convert enum to object with proberty 
//for Example :

enum days { "one" =3, "tow", "Three" }

let _days: any = days;

if (_days.one == days.one)
{ 
    alert(_days.one + ' | ' + _days[4]);
}


0

İstediğiniz şey çoğunlukla kolay hata ayıklama (oldukça tür denetimi ile) ve numaralandırma için özel değerler belirtmeniz gerekmiyorsa, yaptığım şey budur:

export type Enum = { [index: number]: string } & { [key: string]: number } | Object;

/**
 * inplace update
 * */
export function enum_only_string<E extends Enum>(e: E) {
  Object.keys(e)
    .filter(i => Number.isFinite(+i))
    .forEach(i => {
      const s = e[i];
      e[s] = s;
      delete e[i];
    });
}

enum AuthType {
  phone, email, sms, password
}
enum_only_string(AuthType);

Eski kodu / veri depolamayı desteklemek istiyorsanız, sayısal tuşları saklayabilirsiniz.

Bu şekilde, değerleri iki kez yazmaktan kaçınabilirsiniz.


0

Çok, çok, çok basit Dize ile numaralandırma (TypeScript 2.4)

import * from '../mylib'

export enum MESSAGES {
    ERROR_CHART_UNKNOWN,
    ERROR_2
}

export class Messages {
    public static get(id : MESSAGES){
        let message = ""
        switch (id) {
            case MESSAGES.ERROR_CHART_UNKNOWN :
                message = "The chart does not exist."
                break;
            case MESSAGES.ERROR_2 :
                message = "example."
                break;
        }
        return message
    }
}

function log(messageName:MESSAGES){
    console.log(Messages.get(messageName))
}

0

Aşağıdaki gibi TypeScript 1.5'te denedim ve benim için çalıştı

module App.Constants {
   export enum e{
        Hello= ("Hello") as any,
World= ("World") as any
    }
}

0

daktilo numaralandırma (v2.5) açıklamaları uygulamak için bir yol arıyordu ve bu desen benim için çalıştı:

export enum PriceTypes {
    Undefined = 0,
    UndefinedDescription = 'Undefined' as any,
    UserEntered = 1,
    UserEnteredDescription = 'User Entered' as any,
    GeneratedFromTrade = 2,
    GeneratedFromTradeDescription = 'Generated From Trade' as any,
    GeneratedFromFreeze = 3,
    GeneratedFromFreezeDescription = 'Generated Rom Freeze' as any
}

...

    GetDescription(e: any, id: number): string {
        return e[e[id].toString() + "Description"];
    }
    getPriceTypeDescription(price: IPricePoint): string {
        return this.GetDescription(PriceTypes, price.priceType);
    }

-1

TypeScript 0.9.0.1

enum e{
    hello = 1,
    somestr = 'world'
};

alert(e[1] + ' ' + e.somestr);

TypeScript Oyun Alanı


Ortaya çıkan JavaScript çalışır, ancak bu bir derleyici hatası üretir yapar: Cannot convert 'string' to 'e'..
Sam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.