1. JavaScript / Говнокод #27901

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    interface Animal {
      live(): void;
    }
    interface Dog extends Animal {
      woof(): void;
    }
     
    type Example1 = Dog extends Animal ? number : string;
     
    type Example2 = RegExp extends Animal ? number : string;
    
    function main() {
    
        let a: Example1;
        a = 10.0;
    
        print(a);
      
        let b: Example2;
        b = "asd";
    
        print(b);
    
        print("done.");
    }

    "Условные типа" подвезли.... ура ... теперь можно всякую х. наговнокодить..

    Запостил: ASD_77, 28 Декабря 2021

    Комментарии (22) RSS

    • вот более прикольный примерчик

      type IdLabel = number;
       
      type NameLabel = string;
      
      type NameOrId<T extends number | string> = T extends number
        ? IdLabel
        : NameLabel;
      
      function main() {
      
          let a: NameOrId<number>;
          a = 10.0;
      
          print(a);
        
          let b: NameOrId<string>;
          b = "asd";
      
          print(b);
      
          print("done.");
      }
      Ответить
      • Ребят, спасибо вам всем большое за минусы (тем кто поддерживает конечно же огромное уважение).
        Ответить
    • а где мои коменты?
      Ответить
      • я их удалил
        Ответить
      • Тут бы придумать какой-нибудь реальный пример.
        Ответить
        • export type Maybe<T> = null | undefined | T;
          
          export interface Path {
              readonly prev: Path | undefined;
              readonly key: string | number;
              readonly typename: string | undefined;
          }
          
          /**
           * Given a Path and a key, return a new Path containing the new key.
           */
          export function addPath(
              prev: Readonly<Path> | undefined,
              key: string | number,
              typename: string | undefined,
          ): Path {
              return { prev, key, typename };
          }
          
          /**
           * Given a Path, return an Array of the path keys.
           */
          export function pathToArray(
              path: Maybe<Readonly<Path>>,
          ): Array<string | number> {
              const flattened = [];
              let curr = path;
              while (curr) {
                  flattened.push(curr.key);
                  curr = curr.prev;
              }
              flattened.reverse();
              return flattened;
          }
          
          function main() {
              print("Hello");
              let pathArray = pathToArray({
                  key: "path",
                  prev: undefined,
                  typename: undefined,
              });
              for (let x of pathArray) {
                  print(x);
              }
          
              print("Done.");
          }


          такой пойдет? шас буду проверять работает или нет
          Ответить
          • Неправильное у вас Maybe. Второй кейз должен быть обёрнут в конструктор, иначе простое Nullable говно получается, которое нестить нельзя. См. случай T = null или T = Maybe T'.
            Ответить
            • если T = null то юнион тип не измениться
              Ответить
              • Ну так. И это сломает семантику >>= для твоего Maybe.
                Ответить
    • А от значений типы могут зависеть?

      Например type x = a > 42 ? string : number
      Ответить
      • Можно ли описать тип функции, которая возвращает number если её аргумент больше 42 и string в противном случае?
        Ответить
        • Юнион же: number|string
          Ответить
          • А где здесь "если её аргумент больше 42"?
            Ответить
            • Думаю в теле функции.
              А в каких языках такое задаётся прямо в типе?

              > Either Int String
              Ответить
              • В петузе, например.
                .
                    Inductive req_t : Type :=
                    | pd_get
                    | pd_erase
                    | pd_put : Val -> req_t.
                
                    Definition ret_t req : Type :=
                      match req with
                      | pd_get => option Val
                      | pd_put _ => True
                      | pd_erase => True
                      end.
                
                    Definition State := Map Val.
                
                    Definition step (pid : PID) (s : State) (req : req_t) : State * ret_t req :=
                      match req with
                      | pd_get => (s, s !! pid)
                      | pd_put new_val => (<[pid := new_val]> s, I)
                      | pd_erase => (delete pid s, I)
                      end.
                Ответить
                • P.S. True -- это тип населённый одним единственным элементом, а не булевское значение, если что. Здесь он используется в сёмантике "похуй на возвращаемое значение".
                  Ответить
                  • А можно в одной из веток сделать возвращаемый тип False, чтобы запретить клиенту передавать какие-то значения?
                    Ответить
                    • См. step, он конструирует значение ret_t. Так что не выйдет. Вообще, это кусок кода про тотальные детерминированные IO handler'ы. Запрет на передачу значений проще закодировать в виде констрейнтов в req_t, чтобы это by construction энфорсилось при написании программы, либо пользоваться другим более общим определением, которое такие вещи позволяет.
                      Ответить
              • Типа как в Паскале?
                TFigure = record
                X, Y: Integer;
                case Kind: Integer of
                0: (Width, Height: Integer); // прямоугольник
                1: (Radius: Integer); // окружность
                end;
                Ответить
        • 42 это литеральный тип... и с ним можно делать только "!=" или "==". можно создать юнион типа (1 | 2 | 3 | 4 | 5) и сравнивать с ним.. т.е. 1-5 значения или другие
          Ответить
    • пыхокал
      Ответить
    • Ребят, спасибо вам всем большое за минусы (тем кто поддерживает конечно же огромное уважение).
      Ответить

    Добавить комментарий