TypeScript 类型保护

151 阅读1分钟

自定义类型保护

  interface Bird {
    fly();
    layEggs()
  }
  interface Fish {
    swim();
    layEggs();
  }

  function isFish(pet: Fish | Bird): pet is Fish {   // 自定义类型保护
    return (<Fish>pet).swim !== undefined;
  }
  function getSmallPet(): Fish | Bird {
    if (isFish(pet)) {
      pet.swim();
    }
    else {
        pet.fly();
    }
  }
  

typeof 类型保护

  function padLeft(value: string, padding: string | number) {
      if (typeof padding === "number") {
          return Array(padding + 1).join(" ") + value;
      }
      if (typeof padding === "string") {
          return padding + value;
      }
      throw new Error(`Expected string or number, got '${padding}'.`);
  }

instanceof 类型保护

  interface Padder {
    getPaddingString(): string
  }

  class SpaceRepeatingPadder implements Padder {
      constructor(private numSpaces: number) { }
      getPaddingString() {
          return Array(this.numSpaces + 1).join(" ");
      }
  }

  class StringPadder implements Padder {
      constructor(private value: string) { }
      getPaddingString() {
          return this.value;
      }
  }

  function getRandomPadder() {
      return Math.random() < 0.5 ?
          new SpaceRepeatingPadder(4) :
          new StringPadder("  ");
  }

  // 类型为SpaceRepeatingPadder | StringPadder
  let padder: Padder = getRandomPadder();

  if (padder instanceof SpaceRepeatingPadder) {
      padder; // 类型细化为'SpaceRepeatingPadder'
  }
  if (padder instanceof StringPadder) {
      padder; // 类型细化为'StringPadder'
  }