Полиморфизм на примере 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;
}
}
Что мною понято не так? Спасибо