第41天:类型守卫
#javascript #typescript #100daysofcode #day41

什么是类型的后卫?

类型的守卫是打字稿构造,可让您在特定代码块中完善或缩小值的类型。在处理工会类型或未知值时,它们特别有用。

typeof

打字稿中最简单的类型保护是typeof检查。您可能会用它来区分原始类型。

function logValue(value: string | number) {
  if (typeof value === 'string') {
    console.log('This is a string:', value);
  } else {
    console.log('This is a number:', value);
  }
}

instanceof

使用课程和继承时,instanceof是您的首选守卫。

class Animal {
  move() {
    console.log('Moving... 🚶‍♂️');
  }
}

class Bird extends Animal {
  fly() {
    console.log('Flying... 🦅');
  }
}

function moveAnimal(animal: Animal) {
  if (animal instanceof Bird) {
    animal.fly();
  } else {
    animal.move();
  }
}

类型的后卫和工会

工会是类型相关问题的常见来源。键入后卫可以帮助确保您的代码优雅地处理工会类型。

type Result = { success: true; value: number } | { success: false; error: string };

function processResult(result: Result) {
  if (result.success) {
    console.log('Value is', result.value);
  } else {
    console.error('Error:', result.error);
  }
}

具有自定义属性

处理可能具有特定属性的对象时,in运算符很方便。

interface Car {
  brand: string;
  speed: number;
}

function isFast(car: Car | { name: string }): car is Car {
  return 'speed' in car;
}

使用typeofinstanceof

类型的后卫可以合并以有效处理复杂情况。

function processInput(input: string | number | Animal) {
  if (input instanceof Animal) {
    input.move();
  } else if (typeof input === 'string') {
    console.log('You entered a string:', input.toUpperCase());
  } else {
    console.log('You entered a number:', input.toFixed(2));
  }
}