Обобщенные классы в TypeScript

В этом руководстве вы узнаете про обобщенные классы 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.

Рейтинг
( Пока оценок нет )
Александр Русаков / автор статьи
Программист, разработчик, 12 лет опыта работы в крупных компаниях. Быстро освоил typescript, делюсь своими знаниями на страницах этого сайта.
Загрузка ...
JavaScript и TypeScript