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


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.