
Vadim
22.03.2017
09:03:49
Люди, как сделать так, что б enum содержал имена только определенного перечисляемого типа?
например
type names = 'some' | 'other';
И вот что б enum мог содержать ТОЛЬКО поля some и other
Как это сделать?

Aleh
22.03.2017
09:06:06
никак

Google

andretshurotshka?❄️кде
22.03.2017
09:06:26
{ [P in names]: any } такое что ли?

Aleh
22.03.2017
09:06:28
не юзать enum и использовать перечисления строковых литералов

andretshurotshka?❄️кде
22.03.2017
09:07:24
А, enum

Vadim
22.03.2017
09:07:31

Aleh
22.03.2017
09:08:01
а как вы это гарантируете в enum?
особенно про возрастающую

Andrey
22.03.2017
09:08:18
range еще нету вроде :)

Vadim
22.03.2017
09:08:41
В enum это сделать просто
А как без enum?

Aleh
22.03.2017
09:09:05
используйте строки

Vadim
22.03.2017
10:54:25
Люди, а как использовать вычисляемые строки для полей интерфейсов?

Google

Aleh
22.03.2017
10:54:44
о.о

Vadim
22.03.2017
10:55:55
Например, если я пытаюсь сделать так:
interface Info {
readonly [something]: number;
}
То компилятор ругается "A computed property name in an interface must directly refer to a built-in symbol."
Чего он хочет-то?

Aleh
22.03.2017
10:56:21
Symbol.iterator например

Дмитрий
22.03.2017
10:56:44
Хардкорненько

Vadim
22.03.2017
10:56:50
И как это надо прописать?

Dreamerinnoise
22.03.2017
10:57:04
Тебе надо все поля сделать ридонли?

Aleh
22.03.2017
10:57:05
ты хочешь кастомный символ юзать?

andretshurotshka?❄️кде
22.03.2017
10:57:05
P in something наверно надо?)

Дмитрий
22.03.2017
10:57:08
Вычисляемые интерфейсы, ппц)

andretshurotshka?❄️кде
22.03.2017
10:57:14
something это литерал?

Aleh
22.03.2017
10:57:21
да, что такое something

Vadim
22.03.2017
10:57:31
Ну что-то вычисляемое

Aleh
22.03.2017
10:57:36
что именно?

Vadim
22.03.2017
10:57:38
Например строка
или число

Aleh
22.03.2017
10:58:00
ну грубо говоря
let something = 1; setInterval(() => ++something, 10);
что должен имплементить класс?

Dreamerinnoise
22.03.2017
10:58:17
Что угодно, короче )

Aleh
22.03.2017
10:58:20
реализующий этот интерфейс

Google

Aleh
22.03.2017
10:58:35
или какой объект попадает структурно под интерфейс?)

Vadim
22.03.2017
10:58:43
Короче, имя поля должно быть в виде поля enum

Aleh
22.03.2017
10:58:54
забудь ты про enum -_-

Vadim
22.03.2017
10:59:50
забудь ты про enum -_-
Но я так и не понял как без enum автоматически создавать набор полей с непересекающимися значениями. Которые еще и автоматически пронумерованы

Aleh
22.03.2017
11:00:12
объясни кейс
где это нужно
есть пути получше и с более надежными проверками)

Vadim
22.03.2017
11:01:20
Например у меня такой набор:
export enum AddStaffMemberSteps {
BasicInformationBlock,
AddAvatarBlock,
VenuesBlock,
ContactDetailsBlock,
WorkBlock,
PreviewBlock
}
Каждое из этих полей является числом. При этом они автоматически пронумерованы от 0 до 6 (в данном случае)
Как это реализовать без enum?

Aleh
22.03.2017
11:01:55
так зачем тебе нумерация?

Vadim
22.03.2017
11:02:08
Потому что это в других местах кода используется
Индексы этих полей используются много где

Aleh
22.03.2017
11:02:26
type AddStaffMemberSteps = "BasicInformationBlock" | "AddAvatarBlock" ...

Vadim
22.03.2017
11:03:11
И как автоматически обеспечить связку что б, скажем, "AddAvatarBlock" равнялся 1?
А скажем, "ContactDetailsBlock" == 3

Aleh
22.03.2017
11:03:59
ну, если у вас много где это юзается и автоматически не рефакторится, то никак. Но и проверки увы не будет

Vadim
22.03.2017
11:04:25
ок, спасибо!

Aleh
22.03.2017
11:06:57
хотя, можно сделать так
https://www.typescriptlang.org/play/index.html#src=const%20AddStaffMemberSteps%20%3D%20%7B%0A%20%20%20%20BasicInformationBlock%3A%200%2C%0A%20%20%20%20%0A%7D%3B%0A%0Atype%20AddStaffMemberSteps%20%3D%20keyof%20typeof%20AddStaffMemberSteps%3B

Vadim
22.03.2017
11:08:18
Но при создании const AddStaffMemberSteps не обеспечивается контроля за тем, что б значения полей не пересекались
Это то, что обеспечивает enum
И для чего он был создан

Google

Aleh
22.03.2017
11:08:39
он не обеспечивает далее контроля

Vadim
22.03.2017
11:09:33
А без enum контроля за отсутствием пересечения полей не организовать никак?

Aleh
22.03.2017
11:09:47
ну, можно сделать рантайм функцию какую

Vadim
22.03.2017
11:09:47
Может как-то можно это сделать, скажем, через интерфейсы?

Aleh
22.03.2017
11:10:12
function enum<T extends string>(keys: T[]): Record<T, number>

Vadim
22.03.2017
11:10:34

Aleh
22.03.2017
11:10:36
и тогда можно использовать keyof на этом

Admin
ERROR: S client not available

Vadim
22.03.2017
11:11:20
Вообще странно что язык не предлагает стандартные решения для этого. Раз уж он имеет enum, то и должна вроде как быть нормальная поддержка его
Или полноценная типизированная замена

Aleh
22.03.2017
11:12:02
должна была бы, но он изначально сломан и починить его нереально из-за кучи код базы, которая его юзает
и поэтому его не надо юзать совсем

Vadim
22.03.2017
11:15:25

Aleh
22.03.2017
11:15:35
это же легко)

Vadim
22.03.2017
11:15:36
Но смысл понял
Конечно
Это просто уточнение )
Хорошо, еще вопрос.
Вот создал я например интерфейс:
export interface AddStaffMemberSteps {
BasicInformationBlock: 0;
AddAvatarBlock: 1;
VenuesBlock: 2;
ContactDetailsBlock: 3;
WorkBlock: 4;
PreviewBlock: 5;
}
Как мне указать что функция может принимать только одно из значений этого интерфейса?
Я же не могу создать тип такого плана
type SomeType = AddStaffMemberSteps.BasicInformationBlock | AddStaffMemberSteps.AddAvatarBlock | AddStaffMemberSteps.VenuesBlock

Google

Vadim
22.03.2017
11:21:01
Но компилятор не дает такое сделать

Aleh
22.03.2017
11:21:46
keyof

Vadim
22.03.2017
11:21:51
Упс, забыл про него )
Спасибо! )

Aleh
22.03.2017
11:22:32
но вообще это тоже несовсем правильный путь
надо создать объект, чтобы иметь доступ к полям
и keyof чтобы иметь доступ к ключам

Vadim
22.03.2017
11:25:48
А корректно объект создавать в .d.ts файле?

Aleh
22.03.2017
11:26:05
нет)

Дмитрий
22.03.2017
11:26:15
Боже

Aleh
22.03.2017
11:26:42
вообще не используйте .d.ts файлы

Vadim
22.03.2017
11:26:49
Почему?

Паша
22.03.2017
11:26:49

Aleh
22.03.2017
11:26:58
а зачем они вам?
единственный кейс - положить рядом с js, чтобы дать тайпинги

Паша
22.03.2017
11:27:18
чтобы компилятор не пытался их компилировать

Aleh
22.03.2017
11:27:26
транспайлить?

Паша
22.03.2017
11:27:56
да-да

Aleh
22.03.2017
11:28:20
он все равно их будет парсить, сильно сомневаюсь, что сильно есть выигрыш за счет транспайла