TS 类型保护

27 min read
interface Teacher {
  name: string;
  age: number;
  teaching: () => void;
}

interface Student {
  name: string;
  age: number;
  learning: () => void;
}

type Person = Teacher | Student;

const p = (person: Person) => {
  // 类型“Person”上不存在属性“learning”。
  // 类型“Teacher”上不存在属性“learning”。
  person.learning();
};
  • 使用 in 运算符
const p = (person: Person) => {
  if ("teaching" in person) {
    person.teaching();
  }

  if ("learning" in person) {
    person.learning();
  }
};
  • 使用 as 运算符
const p = (person: Person) => {
  const teacher = person as Teacher;
  const student = person as Student;

  if (teacher.teaching) {
    teacher.teaching();
  } else if (student.learning) {
    student.learning();
  }
};
  • 自定义类型保护,必须定义一个返回类型谓词的函数。
const isTeacher = (person: Person): person is Teacher => {
  return (person as Teacher).teaching !== undefined;
};

const p = (person: Person) => {
  if (isTeacher(person)) {
    person.teaching();
  } else {
    person.learning();
  }
};