@typescript_ru

Страница 187 из 669
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 и использовать перечисления строковых литералов

{ [P in names]: any } такое что ли?
ну тут все равно надо names определять полностью, а потом еще объект с ними

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

Vadim
22.03.2017
09:07:31
не юзать enum и использовать перечисления строковых литералов
Хорошо. Как при этом указать что значения полей должны быть числовыми, не должны повторяться, и должны идти по возрастающей?

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 это сделать просто

А как без 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>

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
function enum<T extends string>(keys: T[]): Record<T, number>
Тут нужно будет реализовать контроль за тем, что б нумерация начиналась от 0 и шла до конца, без пропусков

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
Почему?

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
он все равно их будет парсить, сильно сомневаюсь, что сильно есть выигрыш за счет транспайла

Страница 187 из 669