В этом руководстве вы узнаете про обобщенные классы TypeScript.
Обобщенный класс имеет список параметров универсального типа в угловых скобках <>
, следующих за именем класса:
class className<T>{ //... }
TypeScript позволяет вам иметь несколько универсальных типов в списке параметров типа. Например:
class className<K,T>{ //... }
Обобщенные ограничения также применяются к универсальным типам в классе:
class className<T extends TypeA>{ //... }
Размещение параметра типа в классе позволяет разрабатывать методы и свойства, которые работают с одним и тем же типом.
Пример обобщенного класса в TypeScript
В этом примере мы разработаем общий класс Stack.
Стек — это структура данных, работающая по принципу «last-in-first-out» (или LIFO): последний пришел — первый ушел. Это означает, что первый элемент, который вы помещаете в стек, является последним элементом, который вы можете получить из стека.
Как правило, стек имеет размер. По умолчанию он пуст. В стеке есть две основные операции:
- Push: поместить элемент в стек.
- Pop: извлечь элемент из стека.
Ниже показан полный универсальный класс стека с именем Stack<T>
:
class Stack { private elements: T[] = []; constructor(private size: number) { } isEmpty(): boolean { return this.elements.length === 0; } isFull(): boolean { return this.elements.length === this.size; } push(element: T): void { if (this.elements.length === this.size) { throw new Error('The stack is overflow!'); } this.elements.push(element); } pop(): T { if (this.elements.length == 0) { throw new Error('The stack is empty!'); } return this.elements.pop(); } }
Создаем новый стек чисел:
let numbers = new Stack<number>(5);
Эта функция возвращает случайное число между двумя числами, low
и high
:
function randBetween(low: number, high: number): number { return Math.floor(Math.random() *(high - low + 1) + low); }
Теперь вы можете использовать функцию randBetween()
для генерации случайных чисел для помещения в стек numbers
:
let numbers = new Stack<number>(5); while(!numbers.isFull()) { let n = randBetween(1, 10); console.log(`Push ${n} into the stack.`) numbers.push(n); }
Выход:
Push 3 into the stack. Push 2 into the stack. Push 1 into the stack. Push 8 into the stack. Push 9 into the stack.
Ниже показано, как извлекать элементы из стека, пока он не станет пустым:
while(!numbers.isEmpty()) { let n = numbers.pop(); console.log(`Pop ${n} from the stack.`); }
Выход:
Pop 9 from the stack. Pop 8 from the stack. Pop 1 from the stack. Pop 2 from the stack. Pop 3 from the stack.
Точно так же вы можете создать стек строк. Например:
let words = 'The quick brown fox jumps over the lazy dog'.split(' '); let wordStack = new Stack<string>(words.length); // push words into the stack words.forEach(word => wordStack.push(word)); // pop words from the stack while(!wordStack.isEmpty()) { console.log(wordStack.pop()); }
Как это устроено:
- Сначала разделите предложения на слова.
- Во-вторых, создайте стек, размер которого равен количеству слов в массиве words.
- В-третьих, поместите элементы массива слов в стек.
- Наконец, извлекайте слова из стека, пока он не станет пустым.
В этом руководстве вы узнали, как разрабатывать обобщенные классы в TypeScript.