TypeScript - конструктор копирования - PullRequest
0 голосов
/ 10 февраля 2019

Поддерживает ли TypeScript конструктор копирования (например, для , например, C ++ )?

Если ответ отрицательный (или еще нет), то какова лучшая практика инициализации нашегобазовый класс (который мы расширяем) и копирование из существующего экземпляра (того же типа базового класса)

Текущий код:

в настоящее время наш код использует объявленный вручную метод copy()наш базовый класс, который требует, чтобы базовый класс уже был инициализирован,

, но наш базовый класс (ShopConfig) может иметь некоторые довольно дорогие операции в своем конструкторе, которые уже выполнены один раз и не потребуются, когдав TypeScript реализована концепция конструктора копирования.

class ShopConfig {
    public apiKey: string;
    public products: any;

    constructor(apiKey: string = 'trial') {
        this.apiKey = apiKey;
        //Fetch list of products from local Data-Base
        this.products = expensiveDataBaseQuery();
    }

    protected copy(other: ShopConfig) {
        for (const field in other) {
            if (other.hasOwnProperty(field)) {
                this[field] = other[field];
            }
        }
    }
}

class ShopManager extends ShopConfig {

  constructor(config: ShopConfig) {
      super();
      super.copy(config);
      console.log('ShopManager configurations:', config);
  }
}

1 Ответ

0 голосов
/ 10 февраля 2019

Изменение аргумента конструктора базового класса (т.е. ShopConfig) для использования комбинации | операторов и последней проверки v, как v instanceof ClassName и typeof v === 'primitiveName', сделали свое дело:

class ShopConfig {
    public apiKey: string;
    public products: any;

    constructor( v: ShopConfig
            | string | String
            | null
            = 'trial'
    ) {
        if ( ! v) {
            throw new Error('ShopConfig: expected API-Key or existing instance');
        } else if (v instanceof ShopConfig) {
            for (const field in v) {
                if (v.hasOwnProperty(field)) {
                    this[field] = v[field];
                }
            }
        } else if (typeof v === 'string' || v instanceof String) {
            this.apiKey = v.toString();
            // Fetch list of products from local Data-Base
            this.products = expensiveDataBaseQuery();
        }
    }
}

class ShopManager extends ShopConfig {

    constructor(config: ShopConfig) {
        super(config);
        console.log('ShopManager configurations:', config);
    }
}
...