Превышен StackSize - пытается создать API

Я пытаюсь создать динамический API, используя TypeScript и прокси ES6 поверх NodeJ. Я реализовал API, но после небольшого тестирования я обнаружил, что превышаю размер стека. Даже если я попытаюсь с --stack-size, установленным в 16000, но он все равно превосходит его! Я думаю, что у меня есть какой-то рекурсивный метод, который я не вижу.

Вот мой код:

export class StackPlate {
public static build(name: string, parent: StackPlate, callback: (type: string, data: any) => any) {
    return (new StackPlate(name, parent, callback)).proxy;
}

private callback: (type: string, data: any) => any;
private parent: StackPlate;
private childs: {[key: string]:  StackPlate} = {};
private name: string = "";
public proxy;

constructor(name: string, parent: StackPlate, callback: (type: string, data: any) => any) {
    this.parent = parent;
    this.name = name;
    this.callback = callback;

    this.proxy = new Proxy((...parameters) => {
        let stack = [this.name];
        let parent = this.parent;
        while(parent) {
            stack.push(parent.getName());
            parent = parent.getParent();
        }
        stack = stack.reverse();
        return this.callback("call", {stack, parameters});
    }, {
        get: (target, property: string): any => {
            if(this.childs[property])
                return this.childs[property].proxy;

            let child = StackPlate.build(property, this, this.callback);
            this.childs[property] = child;

            this.callback("get", {target, property, child});

            return child.proxy;
        },
        set: (target, property: string, value: any, receiver): boolean => {
            let stack = [property, this.name];
            let parent = this.parent;
            while(parent) {
                stack.push(parent.getName());
                parent = parent.getParent();
            }
            stack = stack.reverse();
            return this.callback("set", {stack, property, target, value});
        }
    });
}

public getName() {
    return this.name;
}

public getChilds() {
    return this.childs;
}

public getParent() {
    return this.parent;
}
}

Я использую TypeScript 2.4.2 и Node 8.7.0 (также пробовал на более низкой версии 8.x). В моем конфиге я установил цель в es6. Я не могу понять, где моя проблема!

PS: Тест:

let plate = StackPlate.build("test", undefined, console.log);
plate.a.b.c();  

1 ответ

Нашел проблему! Внутри ловушки я использовал StackPlate.build метод, который на самом деле возвращает прокси, а не сам объект! И это создало цикл:)

Другие вопросы по тегам