当一个变量在Typescript中扩展另一个变量时,如何声明类型为A或B的变量



我有一个上下文提供程序,它在整个应用程序中流式传输用户数据。

我有一个学生界面:

export interface Student extends User

我希望提供商返回类型为StudentUser的用户数据,如下所示:

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);
}

最新更新