返回

用 never 类型加固 TypeScript 之墙

前端

TypeScript 中的 never 类型,如同它的名字一般,代表着一种永远不会发生的情况。这种类型可以用来表示那些根本无法触及或访问的值,例如:

  • 函数中抛出错误时,返回类型为 never
  • 无限循环或递归函数,永远不会终止
  • 永远无法访问的变量或对象属性
  • 类型别名或联合类型中,包含了 never 类型

never 类型的独特之处在于,它可以与任何其他类型结合使用,形成新的类型。例如,如果一个函数的参数类型为 never,那么这个函数将永远不会被调用。再比如,如果一个对象的属性类型为 never,那么这个属性将永远不会被访问。

never 类型还可以用来保护代码,防止出现意外情况。例如,如果一个函数返回类型为 never,那么这个函数就不会返回任何值。这可以防止在使用这个函数时出现错误。

总的来说,never 类型是一个非常有用的类型,可以帮助开发人员构建更为稳固的代码库,提高代码的质量。

当然,never 类型也有一些需要注意的地方。例如,如果一个函数的返回类型为 never,那么这个函数就不能被用作其他函数的参数。再比如,如果一个对象的属性类型为 never,那么这个属性就不能被赋值。

另外,never 类型与其他类型的结合也需要谨慎使用。例如,如果一个交叉类型中包含了 never 类型,那么这个交叉类型本身的类型就是 never。这可能会导致一些意想不到的问题。

因此,在使用 never 类型时,需要充分考虑其特性和局限性,以避免出现问题。

最后,让我们通过一个例子来理解 never 类型。假设我们有一个函数,这个函数接收一个参数,并返回这个参数的长度。如果参数是字符串类型,那么函数会返回字符串的长度。如果参数是数组类型,那么函数会返回数组的长度。如果参数是其他类型,那么函数会抛出错误。

function getLength(x: string | number | boolean): number {
  if (typeof x === "string") {
    return x.length;
  } else if (Array.isArray(x)) {
    return x.length;
  } else {
    throw new Error("Invalid argument type");
  }
}

在这个函数中,如果我们传入一个字符串或数组类型的参数,那么函数会正常运行。但是,如果我们传入一个布尔值或其他类型的参数,那么函数会抛出错误。这是因为布尔值和其他类型的参数的类型是 never,函数无法处理这种类型的参数。

通过这个例子,我们可以看到 never 类型是如何被用来保护代码的。如果函数的参数类型是 never,那么这个函数就不会被调用。这可以防止在使用这个函数时出现错误。