返回

条件类型:让 TypeScript 参数简化如虎添翼

前端

TypeScript 中的条件类型是一种高级类型,允许我们根据某个条件来创建新的类型。它为我们提供了强大的参数简化能力,让我们能够轻松处理各种复杂的情况。

条件类型的基础

让我们从一个简单的例子开始。假设我们有一个函数,它接受两个参数:一个数字和一个字符串。如果数字大于 0,那么函数会返回字符串;否则,函数会返回数字。

function conditionalFunction(x: number, y: string): number | string {
  if (x > 0) {
    return y;
  } else {
    return x;
  }
}

在这个函数中,我们使用了条件类型来实现参数简化。具体来说,我们使用了 number | string 这个联合类型来表示函数的返回值类型。当 x 大于 0 时,函数会返回字符串;否则,函数会返回数字。

使用条件类型进行类型推断

条件类型还可以用于进行类型推断。例如,我们可以使用条件类型来推断函数参数的类型。

function conditionalTypeInference(x: number | string) {
  if (typeof x === "number") {
    // x is a number here
  } else {
    // x is a string here
  }
}

在这个函数中,我们使用了条件类型来推断 x 的类型。如果 x 是一个数字,那么 x 的类型会被推断为 number;如果 x 是一个字符串,那么 x 的类型会被推断为 string

处理可选参数和函数重载

条件类型还可以用于处理可选参数和函数重载。例如,我们可以使用条件类型来实现以下函数:

function optionalParameter(x: number, y?: string): number | string {
  if (y) {
    return y;
  } else {
    return x;
  }
}

在这个函数中,我们使用了条件类型来实现可选参数。具体来说,我们使用了 string | undefined 这个联合类型来表示 y 的类型。当 y 被传递时,函数会返回 y;否则,函数会返回 x

我们还可以使用条件类型来实现函数重载。例如,我们可以使用条件类型来实现以下函数:

function overloadedFunction(x: number): string;
function overloadedFunction(x: string): number;
function overloadedFunction(x: number | string): number | string {
  if (typeof x === "number") {
    return x.toString();
  } else {
    return parseInt(x);
  }
}

在这个函数中,我们使用了条件类型来实现函数重载。具体来说,我们使用了 number | string 这个联合类型来表示函数的参数类型。当 x 是一个数字时,函数会返回 x 的字符串形式;当 x 是一个字符串时,函数会返回 x 的数字形式。

实现类型保护和联合类型

条件类型还可以用于实现类型保护和联合类型。例如,我们可以使用条件类型来实现以下类型保护函数:

function isNumber(x: number | string): x is number {
  return typeof x === "number";
}

在这个函数中,我们使用了条件类型来实现类型保护。具体来说,我们使用了 x is number 这个类型谓词来判断 x 是否是数字。如果 x 是数字,那么函数会返回 true;否则,函数会返回 false

我们还可以使用条件类型来实现联合类型。例如,我们可以使用条件类型来实现以下联合类型:

type NumberOrString = number | string;

在这个联合类型中,我们使用了条件类型来表示数字或字符串类型。

结语

条件类型是 TypeScript 中一项非常重要的进阶特性。它为我们提供了强大的参数简化能力,让我们能够轻松处理各种复杂的情况。我们可以在 TypeScript 中使用条件类型来进行类型推断、处理可选参数和函数重载、实现类型保护和联合类型等。