Size: a a a

2020 June 04

p

polunin.ai in rust_offtopic
Dmitry Olyenyov
sum types там же есть.. type myStr = "a"|"b" ;type myTaggedUnion= {tag:"A", value:number} | {tag:"B", value:string}
Ок. Но без паттерн матчинга это разбирать немного неудобно.
источник

DO

Dmitry Olyenyov in rust_offtopic
это да
источник

DO

Dmitry Olyenyov in rust_offtopic
но там даже можно сделать exhausive check :)
if(myvar.tag == "A"){} else { throw new UnreachableCaseError(myvar)}
там есть тип never
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
Ок. Но без паттерн матчинга это разбирать немного неудобно.
ну так же разбираешь:

switch myStr
{
  case "a" => ...
}
источник

DO

Dmitry Olyenyov in rust_offtopic
UnreachableCaseError описан как  function UnreachableCaseError(obj:never){}
источник

DO

Dmitry Olyenyov in rust_offtopic
поэтому, если ты не обработаешь все случаи, то вылетит ошибка компиляции.
источник

AZ

Alex Zhukovsky in rust_offtopic
если где-то пишется код рассчитывающий на x:never то что-то в датском королевстве не в порядке
источник

p

polunin.ai in rust_offtopic
Alex Zhukovsky
ну так же разбираешь:

switch myStr
{
  case "a" => ...
}
Я же говорю, немного неудобно.
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
Я же говорю, немного неудобно.
а чего неудобного?
источник

p

polunin.ai in rust_offtopic
Dmitry Olyenyov
но там даже можно сделать exhausive check :)
if(myvar.tag == "A"){} else { throw new UnreachableCaseError(myvar)}
там есть тип never
Вау. Спасибо
источник

p

polunin.ai in rust_offtopic
Alex Zhukovsky
а чего неудобного?
Ну в расте:
match foo {
 Enum::Variant(field1, field2) => ...
}
источник

p

polunin.ai in rust_offtopic
И сразу видно, что ты разбираешь, читается легче
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
Ну в расте:
match foo {
 Enum::Variant(field1, field2) => ...
}
в тайпскрипте есть гвард функции
источник

AZ

Alex Zhukovsky in rust_offtopic
if (Variant.is(foo)) {
  let (x,y) = (foo.field1, foo.field2);
}
источник

AZ

Alex Zhukovsky in rust_offtopic
но оно работает только если ты под варианты структурки сделаешь, на строках такое работать офк не будет
источник

p

polunin.ai in rust_offtopic
О.о
источник

p

polunin.ai in rust_offtopic
Ок, можно жить, спасибо.
источник

DO

Dmitry Olyenyov in rust_offtopic
Alex Zhukovsky
если где-то пишется код рассчитывающий на x:never то что-то в датском королевстве не в порядке
Нет, это реально проверка на то, что все кейсы обработаны. Я часто такое делаю для вещей, которые генерируются из бэкенда. К примеру, есть какой-нить
enum RestErrorsEnum {
 BUSINESS_ERROR1,
 INTERNAL,
}

function myHandler(error: RestErrorsEnum) {
 switch (error) {
   case BUSINESS_ERROR1:
     return "Какая-то бизнес-ошибка";
   case INTERNAL:
     "Внутренняя ошибка";
   default:
     throw new UnreachableCaseError(error);
 }
}
А потом на бэке добавляют еще одну ошибку и у меня код перестаёт собираться. Офигенно же
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
Ок, можно жить, спасибо.
export class BadRequestError extends Error {
   public static is<T>(obj: NonNullable<T> | BadRequestError): obj is BadRequestError {
       return obj instanceof BadRequestError;
   }

   constructor(message?: string) {
       super(message);
   }
}

export interface ApiError extends Error {
  message: string;
  status: number;
  response: string;
}

export const ApiError = {
   is<T>(obj: NonNullable<T> | ApiError): obj is ApiError {
       type hasIsApiException = { isApiException?: boolean };
       return (obj as hasIsApiException).isApiException || false;
   }
};

Вот
у меня такое есть например
источник

DO

Dmitry Olyenyov in rust_offtopic
сейчас уже можно || заменять на ?? :)
источник