Полиморфизм на примере TypeScript

Хочу привести несколько примеров полиморфизма на примере TypeScript. Делаю это с посылом "верно ли я понял?", а не "смотрите как надо!". Буду благодарен если поправите/дополните:

// мономорфная функция
function foo(a: string) {
    // пример обычной мономорфной функции
}

// полиморфная функция
// полиморфизм подтипов
function bar(a: string|number) {
    // функция принимает параметр a, который может быть строкой или числом
    // то есть тип a: string|number это супертип для a: string и a: number
}

// полиморфная функция
// параметрический полиморфизм
function baz<A>(a: A) {
    // функция принимает параметр любого типа и можно сделать вывод, что это
    // параметрический полиморфизм. Но параметрический полиморфизм должен работать
    // одинаково для аргументов любого типа. В данном случае это не является возможным
    // Если сделать a.toUpperCase() для строки и для числа результаты будут отличаться
    // от возвращенной строки до выброса исключения.
}

function baz<A>(a: A[]) {
    // таже история, но тут результат работы будет одинаков для параметра любого типа
    return a.map((item) => console.log(item));
}

// ad-hoc полиморфизм перегрузка функции
function fn(a: number, b: number): string;
function fn(a: string|number, b?: number): string {
    return '';
}

// ad-hoc полиморфизм привидение типов
function any(a: any) {
    switch (typeof a) {
        case 'string': return  a.toUpperCase();
        case 'number': return  a ** a;
    }
}

// полиморфизм подтипов с использованием наследования
class Person {
    constructor(protected readonly name: string) {
        this.name = name;
    }

    public getName(): string {
        return this.name;
    }
}

class Guest extends Person {
    constructor(protected readonly name: string, protected readonly age: number) {
        super(name);
        this.age = age;
    }

    getName(): string {
        return super.getName() + ' ' + this.age;
    }
}

// полиморфизм подтипов без использования наследования
interface IUser {
    getInfo(): string;
}

class User implements IUser {
    constructor(protected readonly name: string) {
        this.name = name;
    }

    getInfo(): string {
        return this.name;
    }
}

class Admin implements IUser {
    constructor(protected readonly name: string) {
        this.name = name;
    }

    getInfo(): string {
        return this.name;
    }
}

Что мною понято не так? Спасибо


Ответы (0 шт):