ЙажаСценарий / Говнокод #27901 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 ASD_77, (Updated )

Комментарии (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'.
          Ответить
  • А от значений типы могут зависеть?

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

            > 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 значения или другие
        Ответить
  • Ребят, спасибо вам всем большое за минусы (тем кто поддерживает конечно же огромное уважение).
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8