我有一个上下文提供程序,它在整个应用程序中流式传输用户数据。
我有一个学生界面:
export interface Student extends User
我希望提供商返回类型为Student
或User
的用户数据,如下所示:
let userData: Student | User = null;
当试图访问仅对学生可用的属性时,userData?.currentTeam
,VS Code会抛出以下错误:
Property 'currentTeam' does not exist on type 'Student | User'.
Property 'currentTeam' does not exist on type 'User'.ts(2339)
我需要帮助找出它为什么默认为父接口,以及如何允许两者都有
这是联合的标准行为:除非您检查正在处理的类型,否则typescript将只允许您访问联合的所有成员上存在的属性。
以下是一些如何缩小类型的示例。您可以检查属性是否存在:
if ('currentTeam' in userData) {
console.log(userData.currentTeam);
}
或者,若您已经创建了类(可能并没有(,您可以使用实例:
if (userData instanceof Student) {
console.log(userData.currentTeam);
}
或者,你可以更改类型,使它们都有一个共同的属性,然后你可以检查它,看看你在处理什么类型。这有时被称为";歧视性联盟";。
interface User {
type: 'user',
// rest of the type here
}
interface Student extends User {
type: 'student',
currentTeam: // something,
// rest of the type here
}
if (userData.type === 'student') {
console.log(userData.currentTeam);
}