Создать перечисление со строковыми значениями


262

Следующий код может быть использован для создания enumв TypeScript:

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

И значения могут быть доступны:

e.hello;
e.world;

Как мне создать enumсо строковыми значениями?

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

Возглавляет типов Singleton по форме строковых литералов типов # 1003 должны решить эту проблему
Andreas Frische

Ответы:


409

TypeScript 2.4

Теперь есть строковые перечисления, поэтому ваш код просто работает:

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

🌹

TypeScript 1.8

Начиная с TypeScript 1.8, вы можете использовать строковые литеральные типы для обеспечения надежного и безопасного взаимодействия с именованными строковыми значениями (что частично используется для перечислений).

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

Подробнее: https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types

Legacy Support

Перечисления в TypeScript основаны на числах.

Вы можете использовать класс со статическими членами, хотя:

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

Вы могли бы пойти и так:

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

Обновление: на основе требования, чтобы быть в состоянии сделать что-то вроде var test:E = E.hello;следующего удовлетворяет этому:

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); 

Небольшое улучшение:toString(): string { return this.value; }
psulek

@psulek На самом деле машинопись будет сделать вывод , что toStringвозвращает строку , поскольку она возвращает this.valueи valueимеет тип строки. Таким образом, вы не можете сделать, var x:number = E.hello.toString();и если вы делаете var x = E.hello.toString();x, это также относится к типу string:)
Басарат

2
@BASarat Это правда, что машинописный текст обрабатывает такой случай, но я имею в виду, чтобы всегда иметь украшенные методы с возвращаемыми типами каждый раз, когда мы его знаем, даже для компилятора ts нет необходимости, но для нас, программистов, знать, когда мы увидели определение метода, что типа это возвращает.
Псулек

@ Басарат есть ли недостатки в замене get()метода на return this.value? Таким образом, он будет возвращать строковое значение при каждом обращении, а не только при конвертации toString().
Джон

@basarat Если у вас есть несколько таких «перечислений», компилятор не будет различать их из-за структурной типизации - компилятор будет видеть valueчлен во всех типах и обрабатывать их как сопоставимые типы. Вы можете сделать valueчлен частным, хотя. Таким образом, компилятор не увидит его и не попытается применить структурную типизацию.
Кирилл Дж.

113

В последней версии (1.0RC) TypeScript вы можете использовать перечисления следующим образом:

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]);

Обновление 1

Чтобы получить числовое значение члена перечисления из строкового значения, вы можете использовать это:

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

Обновление 2

В последнем TypeScript 2.4 были введены строковые перечисления, например:

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

    // Aliases
    RemoveUser = DeleteUser,
}

Для получения дополнительной информации о TypeScript 2.4 читайте блог на MSDN .


2
Как правило, это решение является предпочтительным (поскольку это реальное перечисление), однако вы очень ограничены тем, что такое имя перечисления (отсюда и «строка»).
JasonS

2
Лучшее решение на сегодняшний день.
Алон Амир

2
Что-нибудь новое по этому поводу? Потому States[str]что в настоящее время не работает. Type 'string' is not assignable to type 'States'
MrCroft,

1
@MrCroft Вы можете использовать: States[str as any]сделать в текущей (2.x) версии Typescript.
psulek

Штаты [ул] это то, что я искал. Спасибо!
Мартин Коничек

81

TypeScript 2.4+

Теперь вы можете присваивать строковые значения непосредственно членам перечисления:

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

Смотрите # 15486 для получения дополнительной информации.

TypeScript 1.8+

В TypeScript 1.8+ вы можете создать строковый литерал для определения типа и объекта с тем же именем для списка значений. Он имитирует ожидаемое поведение строкового перечисления.

Вот пример:

type MyStringEnum = "member1" | "member2";

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

Который будет работать как строковое перечисление:

// 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

Обязательно наберите все строки в объекте! Если вы этого не сделаете, то в первом примере выше переменная не будет неявно типизирована MyStringEnum.


1
Как я могу определить нечто подобное в файле декларации?
Зев Шпиц

@ZevSpitz вы можете сделать это
Дэвид Шеррет

Стоит отметить, что с текущим компилятором, вы можете неправильно набирать строковые значения в MyStringEnum, и он не будет жаловаться. Я создал интерфейс Enforcer, чтобы мои строки всегда были действительными. Например: interface MyStringEnumEnforcer {Member1: MyStringEnum, Member2: MyStringEnum} Затем const MyStringEnum: MyStringEnumEnforcer = {Member1: "member1", Member2: "member2"} Это не допускает ошибочные строки, хотя компилятор может в конечном итоге работать для вашего оригинальный сценарий в конце концов. С таким подходом много церемоний, но мне нравится безопасность.
Jmorc


40

В TypeScript 0.9.0.1, хотя и возникает ошибка компилятора, компилятор все же может скомпилировать файл ts в файл js. Код работает, как мы и ожидали, и Visual Studio 2012 может поддерживать автоматическое завершение кода.

Обновить :

В синтаксисе TypeScript не позволяет нам создавать перечисление со строковыми значениями, но мы можем взломать компилятор: 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']);

Игровая площадка


1
Хороший хак, но вы не можете использовать эти перечисления / константы в операторе switch, например case Link.LEARN:, получите Cannot convert 'Link.LEARN' to 'string'ошибку сборки. Кастинг не будет работать.
Ушел кодирование

@TrueBlueAussie Это, кажется, работает хорошо для меня, использующего TSC 1.0.0.0. Кроме того, если по какой-то причине вам нужно поместить строковую константу / переменную в оператор case, это сработает, если вы приведете ее к любому.
CodeAndCats

1
Кроме того, спасибо @ zjc0816, я чертовски люблю это решение :)
CodeAndCats

это решение, которое я хотел.
Murhaf Sousli

5
Забавно, мне интересно, почему TypeScript уже не просто поддерживает строки enum ... Многие люди хотят этого (включая меня).
Хенди Ираван

23

TypeScript 2.1 +

Типы поиска , введенные в TypeScript 2.1, позволяют использовать другой шаблон для имитации строковых перечислений:

// 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 в TypeScript появилась встроенная поддержка перечисления строк, поэтому приведенное выше решение не требуется. Из документов TS:

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

Как бы я это сделал, если имя ключа enum отличается от строкового значения (например, потому что оно очень длинное)?
CletusW

Неважно! Решено в ответе @ Łukasz-pniewski ниже: stackoverflow.com/a/42820134/1431146
CletusW

tslint выдаст ошибку в этом примере String-Enum при попытке обратного сопоставления Enum: Элемент неявно имеет тип 'any', потому что индексное выражение не имеет типа 'number'. Я предполагаю, что проблема в том, что в строке TS перечисления Enums не могут быть отображены в обратном порядке, см. Комментарий в примере String-Enum по адресу typescriptlang.org/docs/handbook/release-notes/… - Кажется, это верно для TS 2.4, где Было представлено String-Enum, но я также получаю сообщение об ошибке в TS 2.6.2. Пример: Colors["RED"]не сработает. Любая идея, как решить эту проблему (требуется для преобразования JSON).
Мази

19

Почему бы просто не использовать собственный способ доступа к строкам перечисления.

enum e {
  WHY,
  NOT,
  USE,
  NATIVE
}

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

2
Это ответ, который я искал, спасибо! Другие решения - умные обходные пути, но это так просто :)
М--

19
Это не отвечает на вопрос. Вопрос не в доступе к строкам перечисления. enum Why { Because = "You Can't", Always = "Do Things That Way." };)
Джеймс Уилкинс

При использовании перечислений числовых значений возникают проблемы, такие как ложное значение 0, сложность в отладке и т. Д.
robmcm

@robmcmolved enum e {WHY = 1, NOT = 2, USE = 3, NATIVE = 4} e [e.WHY] // это возвращает строку «WHY»
Mient-jan Stelling

16

Вы можете использовать строковые перечисления в последней версии TypeScript:

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

Источник: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/


ОБНОВЛЕНИЕ - 2016

Немного более надежный способ создания набора строк, который я использую для React в эти дни, выглядит следующим образом:

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
Это был самый лаконичный способ, который сделал эту работу для меня ... По крайней мере, пока я не смогу выяснить, как обновить мои строительные леса для компиляции с TS 1.8
ThinkBonobo

Тем не менее, одной из проблем является то, что <string>e.helloвызывает ошибку. e.helloвсе еще считается компилятором как число. <number>e.helloработает, хотя. Есть ли способ обойти это? Все, что я могу думать, это <string><any>e.hello.
RainingChain

Другая проблема - когда член enum равен значению enum. Пример:enum Test { a = <any>"b", b = <any>"c", c = <any>"a" } Test.a === 'c'
RainingChain

Я использую этот метод все время. String enum's rock. Обидно, что компилятор не имеет поддержки первого класса для строковых литералов, но у него есть поддержка второго класса. Компилятор на самом деле знает, когда вы использовали хак <any>, поскольку он не позволит вам использовать его в файле .d.ts - это мне дает некоторую легитимность использованию этого «хака», так как компилятор, очевидно, знает об этом, но не останавливает это полностью.
CodeAndCats

Кстати, если вы хотите сравнить строковое значение со значением строкового перечисления, а не <any><string>someStringValue == someEnumValue.toString()
приводить

10

Вот довольно чистое решение, которое позволяет наследовать, используя TypeScript 2.0. Я не пробовал это на более ранней версии.

Бонус: значение может быть любого типа!

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
Отличный ответ! Я изо всех сил пытался создать какой-нибудь объект типа Enum с поддержкой наследования.
DanielM

Пример использования Enum на основе классов: goo.gl/SwH4zb (ссылка на площадку TypeScript).
DanielM

8

Хакерский способ это:

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]];
}

Как пользоваться

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

7

Это работает для меня:

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

или

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

8)

Обновление: вскоре после публикации я обнаружил другой способ, но забыл опубликовать обновление (однако кто-то уже упоминал об этом выше):

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

4

Я просто объявляю интерфейс и использую переменную этого типа для доступа к enum. Синхронизация интерфейса и перечисления на самом деле проста, поскольку TypeScript жалуется, если что-то меняется в перечислении, например, так.

ошибка TS2345: Аргумент типа 'typeof EAbFlagEnum' не может быть назначен параметру типа 'IAbFlagEnum'. Свойство 'Move' отсутствует в типе 'typeof EAbFlagEnum'.

Преимущество этого метода в том, что для использования enum (interface) в различных ситуациях не требуется приведение типов, и таким образом поддерживается больше типов ситуаций, таких как switch / case.

// 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;

Использование переменной вместо перечисления дает желаемые результаты.

var strVal: string = AbFlagEnum.Edit;

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

Флаги были еще одной необходимостью для меня, поэтому я создал модуль NPM, который добавляет этот пример и включает тесты.

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


Это единственный ответ, который я нашел, который позволяет смешивать определения с импортом. Ницца! Вы можете использовать export default EAbFlagEnum as IAbFlagEnum;вместо повторного выделения переменной. Я также убрал <any>приведение в enum, все отлично работает.
Гийом Ф.

4

ОБНОВЛЕНИЕ: TypeScript 3.4

Вы можете просто использовать as const:

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

TypeScript 2.1

Это также может быть сделано таким образом. Надеюсь, это поможет кому-нибудь.

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

Это именно то, что мне было нужно! Он поддерживает, чтобы имя ключа отличалось от строкового значения, как вы показали с разницей в верхнем и нижнем регистре. Спасибо!
CletusW

2

С помощью пользовательских преобразователей ( https://github.com/Microsoft/TypeScript/pull/13940 ), которые доступны в typcript @ next, вы можете создать объект типа enum со строковыми значениями из строковых литеральных типов.

Пожалуйста, посмотрите на мой пакет npm, ts-transformer-enumerate .

Пример использования:

// 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

TypeScript <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!

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

К исходной ссылке вы можете найти более простые способы выполнения строкового литерала


2

Там много ответов, но я не вижу полных решений. Проблема с принятым ответом, так же как и в том enum { this, one }, что он распределяет строковое значение, которое вы используете во многих файлах. Мне тоже не очень нравится «обновление», оно сложное и не использует типы. Я думаю, что ответ Майкла Бромли является наиболее правильным, но его интерфейс немного затруднителен и может быть связан с типом.

Я использую TypeScript 2.0. * Вот что я хотел бы сделать

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

let greet: Greeting = Greeting.hello

Он также имеет гораздо более приятную информацию о типе / наведении курсора при использовании полезной IDE. Недостатком является то, что вы должны написать строки дважды, но, по крайней мере, это только в двух местах.


1

Ответ @ Басарата был великолепен. Вот упрощенный, но немного расширенный пример, который вы можете использовать:

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

Недавно столкнулся с этой проблемой в TypeScript 1.0.1 и решил ее следующим образом:

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

Я думаю, что вы должны попробовать это, в этом случае значение переменной не изменится, и оно работает как перечисления, использование как класса также работает, единственный недостаток - по ошибке вы можете изменить значение статической переменной, и вот что мы не хотим в перечислениях.

namespace portal {

export namespace storageNames {

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

  }
}


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

Если то, что вам нужно, это в основном легкая отладка (с достаточно проверкой типа) и не нужно указывать специальные значения для перечисления, это то, что я делаю:

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);

Если вы хотите поддерживать устаревший код / ​​хранилище данных, вы можете сохранить цифровые клавиши.

Таким образом, вы можете избежать ввода значений дважды.


0

Очень, очень, очень простой Enum со строкой (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

Я пробовал в TypeScript 1.5, как показано ниже, и это работает для меня

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

0

я искал способ реализовать описания в перечислениях машинописного текста (v2.5), и этот шаблон работал для меня:

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 Playground


В результате JavaScript работает, но это действительно производит ошибку компилятора: Cannot convert 'string' to 'e'..
Сэм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.