Skip to content

never 类型与穷尽性检查

在缩小范围时,你可以将一个联合体的选项减少到你已经删除了所有的可能性并且什么都不剩的程度。在这些情况下,TypeScript将使用一个 never 类型来代表一个不应该存在的状态。

never 类型可以分配给每个类型;但是,没有任何类型可以分配给 never(除了 never 本身)。这意味着你可以使用缩小并依靠 never 的出现在 switch 语句中做详尽的检查。

例如,在我们的 getArea 函数中添加一个默认值,试图将形状分配给 never ,当每个可能的情况都没有被处理时,就会引发。

typescript
type Shape = Circle | Square; 

function getArea(shape: Shape) { 
  switch (shape.kind) { 
    case "circle": 
      return Math.PI * shape.radius ** 2; 
    case "square": 
      return shape.sideLength ** 2; 
    default: 
      const _exhaustiveCheck: never = shape; 
      return _exhaustiveCheck; 
  } 
}

在 Shape 联盟中添加一个新成员,将导致TypeScript错误。

typescript
interface Triangle { 
  kind: "triangle"; 
  sideLength: number; 
}

type Shape = Circle | Square | Triangle; 

function getArea(shape: Shape) { 
  switch (shape.kind) { 
    case "circle": 
      return Math.PI * shape.radius ** 2; 
    case "square": 
      return shape.sideLength ** 2; 
    default:
      const _exhaustiveCheck: never = shape; 
      return _exhaustiveCheck; 
  } 
}