#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()
onarray
, он по-прежнему будет иметь типDynamicArray