Створіть перерахунок із значеннями рядків


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

Відповіді:


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

Підтримка спадщини

Переліки в 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 Насправді машинопис може зробити висновок про те, що toStringповертає рядок з моменту повернення this.valueта valueє рядком типу. Так що ви не можете цього робити, var x:number = E.hello.toString();і якщо ви робите var x = E.hello.toString();х, то заражаєтесь і типом string:)
basarat

2
@BASarat Це правда, що typecript обробляє такий випадок, але я маю на увазі завжди мати декоровані методи із типом повернення кожного разу, коли ми це знаємо, навіть це не потрібно для компілятора ts, але для нас, кодери, знати, коли ми бачили визначення методу, що введіть його.
psulek

@basarat Чи є якийсь мінус заміни 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

Щоб отримати числове значення члена enum від рядкового значення, ви можете скористатися цим:

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

Штати [str] - це те, що я шукав. Дякую!
Мартін Конічек

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

Який буде працювати як enum string:

// 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', щоб переконатися, що мої рядки завжди дійсні. Наприклад: інтерфейс 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 не дозволяє нам створити enum зі значеннями рядків, але ми можемо зламати компілятор: 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
Хороший хак, але ви не можете використовувати ці перерахунки / константи в операторі переключення, наприклад, case Link.LEARN:ви отримаєте Cannot convert 'Link.LEARN' to 'string'помилку побудови. Кастинг не вийде.
Пройшов кодування

@TrueBlueAussie Здається, це працює добре для мене під керуванням TSC 1.0.0.0. Крім того, якщо вам з якоїсь причини потрібно вставити константну строку / змінну в оператор case, вона буде спрацьовувати, якщо ви передаєте її будь-якій.
CodeAndCats

1
Також, дякую @ zjc0816, я люблю це рішення :)
CodeAndCats

це рішення, яке я хотів.
Мурхаф Суслі

5
Смішно, мені цікаво, чому TypeScript вже не підтримує рядки перерахунку ... Дуже багато людей хочуть цього (включаючи мене).
Хенді Іраван

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

Не звертай уваги! Які вирішуються в @ Лукаш-Пнівський «s відповідь нижче stackoverflow.com/a/42820134/1431146
CletusW

tslint видасть помилку на цьому прикладі String-Enum при спробі повернути зображення Enum: Елемент неявно має тип "будь-який", оскільки вираз індексу не має типу "число". Думаю, проблема полягає в тому, що в TS-рядку Enums неможливо повернути на зворотній карті, дивіться коментар у прикладі String-Enum на typecriptlang.org/docs/handbook/release-notes/… - Це здається правдою для TS 2.4, де String-Enum був введений, але я також отримую помилку в TS 2.6.2. Приклад: Colors["RED"]не буде працювати. Будь-яка ідея, як вирішити це (потрібно для перетворення JSON).
masi

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 вирішено enum e {WHY = 1, NOT = 2, USE = 3, NATIVE = 4} e [e.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

Я весь час використовую цей метод. Струнний рок Енума. Прикро, що компілятор не має підтримки першого класу для рядкових літералів, але у нього є підтримка другого класу. Компілятор насправді знає, коли ви використовували хакі <any>, оскільки він не дозволить вам використовувати його у файлі .d.ts - це мені дає певну легітимність використанню цього "хаку", оскільки компілятор, очевидно, знає але це не зупиняє його повністю.
CodeAndCats

Btw, якщо ви хочете порівнювати значення рядка зі значенням перерахунку рядка, а не робити його <any>тоді <string>, просто виконайте:someStringValue == someEnumValue.toString()
CodeAndCats

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
Чудова відповідь! Я намагався зробити якийсь об’єкт, схожий на Енума, із підтримкою спадкування.
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. Утримувати інтерфейс та enum у синхронізації насправді просто, оскільки TypeScript скаржиться на те, що в enum щось змінюється, як-от так.

помилка TS2345: Аргумент типу 'typeof EAbFlagEnum' не призначається параметру типу 'IAbFlagEnum'. Властивість "Перемістити" відсутня в типі "typeof EAbFlagEnum".

Перевага цього методу полягає в тому, що для використання enum (інтерфейсу) в різних ситуаціях не потрібне лиття типів, і таким чином підтримується більше типів ситуацій, таких як комутатор / випадок.

// 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, дає бажані результати.

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>акторський склад у перерахунку, він прекрасно працює.
Гійом Ф.

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 ), які доступні в typecript @ next, ви можете створювати перерахунок як об'єкт зі значеннями рядків з рядкових літеральних типів.

Будь ласка, загляньте в мій пакет npm, ts-transformer-перерахуйте .

Приклад використання:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.