Уроки магии в Typescript - PullRequest
       12

Уроки магии в Typescript

0 голосов
/ 08 сентября 2018

У меня есть некоторые проблемы с Typescript и "@ botstan / Magic" библиотекой в ​​nodejs.
прежде чем мы начнем, пожалуйста, прочитайте "Магия" документация .
следуйте линии:

import Magic from "@botstan/magic";
import * as _ from "lodash";

@Magic
export default class Base {
    [key: string]: any;
    props = {};
    constructor (config = {}) {
        const self = this;
        _.forEach(config, (value, key) => {
            self.__set(key, value);
        });
    }
    __isset (name: string): boolean {
        name = _.snakeCase(name);
        return _.has(this.props, name);
    }
    __unset (name: string): void {
        name = _.snakeCase(name);
        _.unset(this.props, name);
    }
    __set (name: string, value: any): void {
        name = _.snakeCase(name);
        if (value !== null || value !== undefined) {
            _.set(this.props, name, value);
            return;
        }

        _.unset(this.props, name);
    }
    __get (name: string): any {
        name = _.snakeCase(name);
        return _.get(this.props, name, undefined);
    }
}

Если вы уже видели документацию "Magic" , вы знаете, что мы только что создали класс Magic в Typescript.

import Base from "./Base";

const obj = new Base();
obj.first_name = "Jone";
obj.last_name = "Done";

console.log(obj.first_name); // Jone
console.log(obj); // { props: { first_name: "Jone", last_name: "Done" } }

Класс "Base" работает хорошо, но наша проблема началась, когда я получил расширение от него.

import Base from "./Base";

export default class Example extends Base {
    someVar: any = false;
    someMethod () {
    }
}

А пока позвольте мне проверить пример класса.

import Example from "./Example";

const obj = new Example();
obj.first_name = "Jone";
obj.last_name = "Done";

console.log(obj.first_name); // Jone
console.log(obj); // { props: { }, first_name: "Jone", last_name: "Done" }

Класс «Пример» не работает как класс «Базовый». Что я могу сделать, чтобы это исправить?

1 Ответ

0 голосов
/ 09 сентября 2018

Я читаю "магию" ... и лично мне это кажется очень бесполезной библиотекой. Лично я бы не трогал это и не загрязнял этим мою базу кода.

Кроме того, если вы расширяете класс (наследовать в общей терминологии ОО), и у этого базового класса есть конструктор, вам нужно вызвать super() в вашем производном классе (Example в вашем случае), который вы ' нет. Это также должен быть первый вызов, сделанный в конструкторе для правильной инициализации базового класса. Попробуйте это и посмотрите, работает ли оно:

export default class Example extends Base {
    someVar: any = false;

    constructor(){
      super({}); // <-- empty obj because base class takes a single init param    
    }
    someMethod () {
    }
}
...