Skip to content

in 操作符缩小

JavaScript 有一个运算符,用于确定对象是否具有某个名称的属性: in 运算符。TypeScript 考虑到了这一点,以此来缩小潜在类型的范围。

例如,使用代码: "value" in x 。这里的 "value" 是字符串文字, x 是联合类型。值为“true”的分支缩小,需要 x 具有可选或必需属性的类型的值;值为 “false” 的分支缩小,需要具有可选或缺失属性的类型的值。

typescript
type Fish = { swim: () => void }; 
type Bird = { fly: () => void }; 

function move(animal: Fish | Bird) { 
  if ("swim" in animal) { 
    return animal.swim(); 
  }
  
  return animal.fly(); 
}

另外,可选属性还将存在于缩小的两侧,例如,人类可以游泳和飞行(使用正确的设备),因此应该出现在 in 检查的两侧:

typescript
type Fish = { swim: () => void }; 
type Bird = { fly: () => void }; 
type Human = { swim?: () => void; fly?: () => void }; 

function move(animal: Fish | Bird | Human) { 
  if ("swim" in animal) { 
    // animal: Fish | Human 
    animal; 
  } else { 
    // animal: Bird | Human 
    animal; 
  } 
}