// 函数重载
function calculate(input: string): number;
function calculate(input: number[]): number;
function calculate(input: string | number[]): number {
if (typeof input ==='string') {
return input.length;
} else {
return input.reduce((acc, cur) => acc + cur, 0);
}
}
// 条件类型工具
type CalculateType<T> = T extends string? number : T extends number[]? number : never;
// 原理解释:
// 1. **函数重载**:
// - 前面两个 `function calculate` 声明是函数重载签名,它们定义了函数 `calculate` 可以接受的不同参数类型和返回值类型。
// - 第三个 `function calculate` 是实际的函数实现,它根据传入参数的类型进行不同的逻辑处理。如果是字符串,返回字符串长度;如果是数字数组,返回数组元素之和。
// 2. **条件类型工具 `CalculateType`**:
// - 它使用条件类型 `T extends U? X : Y`。如果类型 `T` 可以赋值给 `U`,则返回 `X`,否则返回 `Y`。
// - 当 `T` 是 `string` 时,返回 `number` 类型(字符串长度类型);当 `T` 是 `number[]` 时,返回 `number` 类型(数字和的类型);对于其他类型,返回 `never` 类型,表示不支持的类型。