打字稿:对联合类型字段的约束
Typescript: Constraint on a field of an union type
我创建了一个联合类型的对象。它们都有一个字段 role
来区分它们。
这里我们有老师和学生:
type User =
{
role: "student";
followClasses: string[];
} |
{
role: "teacher";
since: number;
};
然后我想创建一个函数来生成一个默认学生:
const defaultStudent = (): User => ({
role: "student",
followClasses: [],
});
但是由于return类型是联合类型User,打字稿不知道这是一个学生,当我输入这个时给我一个警告:
const student = defaultStudent();
console.log(student.followClasses);
// Warning here ⮥
如何使函数 defaultStudent
具有约束 return 类型(学生)?
将联合的两个成员提取为单独的类型
type Student = {
role: "student"
followClasses: string[]
}
type Teacher = {
role: "teacher"
since: number
}
并直接从他们定义你的联合
type User = Student | Teacher
在这一点上,你可以说你的defaultStudent
函数不只是return一个User
,你可以比这更精确。它 return 是 Student
。
const defaultStudent = (): Student => ({
role: "student",
followClasses: [],
})
const student = defaultStudent()
console.log(student.followClasses) // <-- OK
我创建了一个联合类型的对象。它们都有一个字段 role
来区分它们。
这里我们有老师和学生:
type User =
{
role: "student";
followClasses: string[];
} |
{
role: "teacher";
since: number;
};
然后我想创建一个函数来生成一个默认学生:
const defaultStudent = (): User => ({
role: "student",
followClasses: [],
});
但是由于return类型是联合类型User,打字稿不知道这是一个学生,当我输入这个时给我一个警告:
const student = defaultStudent();
console.log(student.followClasses);
// Warning here ⮥
如何使函数 defaultStudent
具有约束 return 类型(学生)?
将联合的两个成员提取为单独的类型
type Student = {
role: "student"
followClasses: string[]
}
type Teacher = {
role: "teacher"
since: number
}
并直接从他们定义你的联合
type User = Student | Teacher
在这一点上,你可以说你的defaultStudent
函数不只是return一个User
,你可以比这更精确。它 return 是 Student
。
const defaultStudent = (): Student => ({
role: "student",
followClasses: [],
})
const student = defaultStudent()
console.log(student.followClasses) // <-- OK