Перегрузка функций в TypeScript
Перегрузка функций позволяет определять несколько сигнатур для функции, а компилятор выбирает правильную реализацию на основе типов переданных аргументов.
SVG-диаграмма: процесс перегрузки функцийБазовый синтаксис
Сначала объявите несколько сигнатур функции, затем реализуйте одну единую функцию.
Пример
// Сигнатуры перегрузки функций
function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a: any, b: any): any {
return a + b;
}
console.log("Сложение чисел: " + add(1, 2));
console.log("Сложение строк: " + add("Привет, ", "World"));
function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a: any, b: any): any {
return a + b;
}
console.log("Сложение чисел: " + add(1, 2));
console.log("Сложение строк: " + add("Привет, ", "World"));
Вывод:
数字相加: 3 字符串相加: Hello, World
Перегрузка с несколькими параметрами
Можно определить различные комбинации нескольких параметров.
Пример
// Несколько сигнатур перегрузки
function greet(name: string): string;
function greet(name: string, greeting: string): string;
// Реализация
function greet(name: any, greeting?: any): any {
if (greeting) {
return greeting + ", " + name + "!";
}
return "Привет, " + name + "!";
}
console.log(greet("Alice"));
console.log(greet("Bob", "Привет"));
function greet(name: string): string;
function greet(name: string, greeting: string): string;
// Реализация
function greet(name: any, greeting?: any): any {
if (greeting) {
return greeting + ", " + name + "!";
}
return "Привет, " + name + "!";
}
console.log(greet("Alice"));
console.log(greet("Bob", "Привет"));
Вывод:
Hello, Alice! Hi, Bob!
Перегрузка методов
Методы в классах также могут использовать перегрузку.
Пример
class Calculator {
// Сигнатуры перегрузки
add(a: number, b: number): number;
add(a: string, b: string): string;
add(a: number, b: string): string;
add(a: any, b: any): any {
return a + b;
}
}
var calc = new Calculator();
console.log("Число: " + calc.add(1, 2));
console.log("Строка: " + calc.add("Привет", "World"));
console.log("Смешанный: " + calc.add(5, " яблок"));
// Сигнатуры перегрузки
add(a: number, b: number): number;
add(a: string, b: string): string;
add(a: number, b: string): string;
add(a: any, b: any): any {
return a + b;
}
}
var calc = new Calculator();
console.log("Число: " + calc.add(1, 2));
console.log("Строка: " + calc.add("Привет", "World"));
console.log("Смешанный: " + calc.add(5, " яблок"));
Вывод:
数字: 3 字符串: HelloWorld 混合: 5 apples
Перегрузка конструкторов
Конструкторы также могут быть перегружены.
Пример
class User {
name: string;
age: number;
// Перегрузка конструкторов
constructor(name: string);
constructor(name: string, age: number);
constructor(name: any, age?: any) {
this.name = name;
this.age = age || 0;
}
}
var user1 = new User("Alice");
var user2 = new User("Bob", 25);
console.log("Пользователь 1: " + JSON.stringify(user1));
console.log("Пользователь 2: " + JSON.stringify(user2));
name: string;
age: number;
// Перегрузка конструкторов
constructor(name: string);
constructor(name: string, age: number);
constructor(name: any, age?: any) {
this.name = name;
this.age = age || 0;
}
}
var user1 = new User("Alice");
var user2 = new User("Bob", 25);
console.log("Пользователь 1: " + JSON.stringify(user1));
console.log("Пользователь 2: " + JSON.stringify(user2));
Вывод:
用户1: {"name":"Alice","age":0}
用户2: {"name":"Bob","age":25}
Перегрузка и объединённые типы
Использование перегрузки вместо объединённых типов обеспечивает более точный вывод типов.
Пример
// Рекомендуется: используйте перегрузку
function process(value: number): number;
function process(value: string): string;
function process(value: any): any {
if (typeof value === "number") {
return value * 2;
}
return value.toUpperCase();
}
// TypeScript знает тип возвращаемого значения
var numResult: number = process(10); // number
var strResult: string = process("hello"); // string
console.log("Результат числа: " + numResult);
console.log("Результат строки: " + strResult);
function process(value: number): number;
function process(value: string): string;
function process(value: any): any {
if (typeof value === "number") {
return value * 2;
}
return value.toUpperCase();
}
// TypeScript знает тип возвращаемого значения
var numResult: number = process(10); // number
var strResult: string = process("hello"); // string
console.log("Результат числа: " + numResult);
console.log("Результат строки: " + strResult);
Вывод:
数字结果: 20 字符串结果: HELLO
Примечания
- Сигнатуры перегрузки должны быть размещены перед сигнатурой реализации
- Сигнатура реализации должна быть совместима со всеми сигнатурами перегрузки
- Сигнатуры перегрузки являются только объявлениями типов и не генерируют фактический код
Итог
- Перегрузка функций:Определите несколько сигнатур, и компилятор выбирает подходящую реализацию
- Перегрузка методов:Также применимо в классах
- Перегрузка конструктора:Предоставляет несколько методов инициализации
- Лучше, чем объединённые типы:Более точные возвращаемые типы