Неизменный стек в TypeScript - PullRequest
0 голосов
/ 02 мая 2020

Привет, я пытаюсь построить неизменный стек, используя TS, и у меня возникают проблемы

В моей функции pu sh я пытаюсь создать новый узел с текущей головкой, установленной в затем и передаем это в конструктор Stack, но каждый раз, когда я это делаю, он говорит, что head имеет значение null.

Я все остальные мои функции, head правильно, но не в моей функции pu sh.

type Node<T> = { value: T; next: Node<T> | null };

export default class Stack<T> {
  constructor(head: Node<T> | null = null) {
    let size = 0;

    let nextNode = head;
    while (nextNode) {
      size++;
      nextNode = nextNode.next;
    }

    Object.defineProperty(this, 'peak', {
      get: () => (head ? head.value : undefined),
    });

    Object.defineProperty(this, 'size', { get: () => size });

    this.push = (value: T) => {
      return new Stack({ value, next: head });
    };

    this.pop = () => new Stack(head ? head.next : null);

    this[Symbol.iterator] = function* () {
      let nextNode = head;
      while (nextNode) {
        yield nextNode.value;
        nextNode = nextNode.next;
      }
    };
  }

  push: (value: T) => Stack<T>;

  pop: () => Stack<T>;

  get peak() {
    return void 0;
  }

  get size() {
    return void 0;
  }

  [Symbol.iterator]: any;
}

1 Ответ

0 голосов
/ 03 мая 2020

Я не могу воспроизвести проблему:

import Stack from "../stack";

describe(Stack, () => {
    test("empty",
        () => {
            const empty = new Stack();
            expect(empty).toBeDefined();
            expect(empty).toBeInstanceOf(Stack);
        }
    );

    test("one element",
        () => {
            const one = new Stack({ "value": 1, "next": null });
            expect(one).toBeDefined();
            expect(one).toBeInstanceOf(Stack);
            expect(one.peak).toEqual(1);
            expect(one.pop()).not.toThrow;

            const empty = one.pop();
            expect(empty).toBeDefined();
            expect(empty).toBeInstanceOf(Stack);
            expect(empty.peak).toBeUndefined;
        }
    );

    test("push once",
        () => {
            const empty = new Stack<number>();

            const one = empty.push(1);
            expect(one).toBeDefined();
            expect(one).toBeInstanceOf(Stack);
            expect(one.peak).toEqual(1);
            expect(one.pop()).not.toThrow;
        }
    );

    test("push twice",
        () => {
            const empty = new Stack<number>();

            const two = empty.push(1).push(2);
            expect(two).toBeDefined();
            expect(two).toBeInstanceOf(Stack);
            expect(two.peak).toEqual(2);
            expect(two.pop()).not.toThrow;

            const one = two.pop();
            expect(one).toBeDefined();
            expect(one).toBeInstanceOf(Stack);
            expect(one.peak).toEqual(1);
            expect(one.pop()).not.toThrow;
        }
    );

    test("iterator",
        () => {
            const stack = new Stack({ "value": 0, "next": { "value": 1, "next": { "value": 2, "next": null } } });
            const array = Array.from(stack);
            const expected = Array.from({ "length": 3 }, (_, i) => i);

            expect(array).toEqual(expected);
        }
    );
});
 PASS  tests/stack.spec.ts
  Stack
    ✓ empty (2ms)
    ✓ one element (1ms)
    ✓ push once
    ✓ push twice (1ms)
    ✓ iterator (1ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |   85.71 |       80 |    62.5 |   89.47 |                   
 stack.ts |   85.71 |       80 |    62.5 |   89.47 | 39-43             
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       5 passed, 5 total
Snapshots:   0 total
Time:        1.383s, estimated 2s
Ran all test suites.
...