Определите динамический тип для массива в typescript

#arrays #typescript #initialization

#массивы #typescript #инициализация

Вопрос:

У меня есть класс, который содержит array.

 let object=new DynamicARRAY()
object.add(12)
object.add("google") // This should not allowed

let object=new DynamicARRAY()
object.add("google")
object.add(12) // This should not allowed
  

как только я установлю тип и массив, как он может поддерживать тип этого массива.

у меня есть что-то вроде этого

 class DynamicArray {
    add(value:string):Array<number>
    add(value:number):Array<string>

    add<T>(value:T):Array<T> {
        let collection = new Array<T>()        
        collection.push(value)
        return collection
    }   
}
  

но не показывайте, как я могу переместить коллекцию на уровне класса и сохранить ее тип.

Нужна просто подсказка в правильном направлении.

Ответ №1:

Что вы хотите, так это сделать ваш класс универсальным, а затем ограничить ваш метод класса для использования этого универсального типа.

 class DynamicArray<T> {
    add(value:T):Array<T> {
        let collection = new Array<T>()        
        collection.push(value)
        return collection
    }   
}
  

При использовании класса вы указываете, какой тип он будет содержать

 const array = new DynamicArray<string>();
array.add('foo');
array.add(12); // will fail
  

Единственный способ, которым я могу думать о наличии общей точки входа, — это статический класс, который создает экземпляр общего типизированного класса.

 class TypedArray<T> {
    private items: T[] = [];

    add(value: T): this {
        this.items.push(value);

        return this;
    }
}

class DynamicArray {
    static add<T>(value:T): TypedArray<T> {
        let collection = new TypedArray<T>()        
        collection.add(value);

        return collection
    }   
}

const array = DynamicArray.add('foo');
array.add('bar');
array.add(12); // fails
  

Комментарии:

1. Да, вы правы, но дело в том, что я не хочу устанавливать тип, он должен быть каким-то образом установлен auto automatic const array = new DynamicArray(); array.add(‘foo’); array.add(12); // произойдет сбой

2. Ваш пример в корне неверен, он возвращает массив, который вы не используете. Правильным использованием было бы array.add(‘foo’).push(12); // который завершится ошибкой. Если бы вы посмотрели, что находится array после обоих ваших add() , вы бы увидели, что это пустой объект

3. Да @opex я знаю это, но пример не идеален, но я просто привел его, чтобы показать, что я имею в виду. Я также не смог найти никакого решения этой проблемы. ваш пример такой же, как мы добавляем тип массива. то, что мы ищем прямо сейчас, — это какой-то lat init коллекции

4. Вы не можете изменить тип переменной после ее создания. array имеет тип DynamicArray , который содержит метод для добавления значений произвольного типа. Это не изменится только потому, что вы вызываете add() on array , он по-прежнему будет иметь тип DynamicArray