打字稿:对联合类型字段的约束

时间:2021-07-29 09:14:32

标签: typescript types constraints field union

我创建了一个联合类型的对象。它们都有一个字段 role 来区分它们。 这里有老师学生

type User =
    {
        role: "student";
        followClasses: string[];
    } |
    {
        role: "teacher";
        since: number;
    };

然后我想创建一个函数来生成一个默认学生

const defaultStudent = (): User => ({
    role: "student",
    followClasses: [],
});

但是由于返回类型是联合类型User,打字稿不知道它是学生,并且抛出当我输入此内容时,我会发出警告

const student = defaultStudent();

console.log(student.followClasses);
//          Warning here ⮥

如何使函数defaultStudent具有约束返回类型(学生)?

1 个答案:

答案 0 :(得分:2)

将联合的两个成员提取为单独的类型

type Student = {
  role: "student"
  followClasses: string[]
}

type Teacher = {
  role: "teacher"
  since: number
}

并直接从它们定义您的联合

type User = Student | Teacher

此时,您可以说您的 defaultStudent 函数不只是返回一个 User,您可以比这更精确。它返回一个 Student

const defaultStudent = (): Student => ({
  role: "student",
  followClasses: [],
})

const student = defaultStudent()
console.log(student.followClasses) // <-- OK