Как я могу сделать обобщенный класс c Typescript, который принимает массив или объект, возвращающий клон массива или объекта? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть родовой c класс. У него есть свойство value с типом ValueType, которое устанавливается при объявлении класса. ValueType может быть массивом или объектом. Я хочу, чтобы метод clone() возвратил клон массива или объекта.

class MyClass<ValueType> {
  value: ValueType;
  clone(): ValueType {
    if (this.value instanceof Array) {
      return [...this.value]; // TS doesn't like this
    } else {
      return {...this.value};
    }
  }
}

Например:

const instance = new MyClass<number[]>();
instance.value = [1, 2, 3];
console.log(instance.clone() === instance.value); // false
console.log(JSON.stringify(instance.value) === JSON.stringify(instance.value)); // true

Но определение класса выдает ошибку на return [...this.value]:

Тип 'any []' нельзя назначить типу "ValueType". 'any []' присваивается ограничению типа 'ValueType', но можно создать экземпляр 'ValueType' с другим подтипом ограничения '{}'.

Полагаю, мне нужно более строго введите this.value instanceof Array, поскольку Array не указывает содержимое массива.

Как это исправить?

Редактировать: Я исправил это, заменив строку с return (([...this.value] as unknown) as ValueType);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...