这个构造函数的最后一个参数是如何工作的?
constructor(clientId: string, authority: string, tokenReceivedCallback: tokenReceivedCallback,
{
validateAuthority = true,
cacheLocation = 'sessionStorage',
redirectUri = window.location.href.split("?")[0].split("#")[0],
postLogoutRedirectUri = redirectUri,
navigateToLoginRequestUrl = true
}:
{
validateAuthority?: boolean,
cacheLocation?: string,
redirectUri?: string,
postLogoutRedirectUri?: string,
navigateToLoginRequestUrl?: boolean,
} = {}) {
...
}
在我看来,如果没有提供任何内容,它会占用一个对象并且该对象已被默认,对吗?
如果我想覆盖一个值,比如cacheLocation,我该怎么做?我可以通过{ cacheLocation: 'localStorage' }
还是必须在这种情况下定义所有属性?
来源:MSAL.js
答案 0 :(得分:1)
简答:
在我看来,如果没有提供任何内容,它会占用一个对象并且该对象已被默认,对吗?
正确。
如果我想覆盖一个值,比如cacheLocation,我该怎么做?我可以通过
{ cacheLocation: 'localStorage' }
还是必须在这种情况下定义所有属性?
是的,您可以只提供cacheLocation
,其余的将获得默认值。
当涉及默认值时,您需要从out到in。
首先,你有= {}
。这意味着您可以在没有对象的情况下调用构造函数:
new Whatever("hello", "world");
接下来,您具有默认值(例如cacheLocation = 'sessionStorage'
)的对象属性绑定。这意味着TypeScript将尝试从名为cacheLocation
的对象中获取属性。如果cacheLocation
为undefined
,那么它将使用默认值('sessionStorage'
),否则TypeScript将使用传入的内容。
这意味着如果您只传入validateAuthority
但不传递redirectUri
的对象,redirectUri
将获得其默认值,但validateAuthority将使用您传入的任何内容。
所有这些都汇集在一起,以便更易于使用的API。当没有给出选项时,将使用最外面的默认值(= {}
)。在空对象({}
)中,cacheLocation
和validateAuthority
等属性将为undefined
。
当原始对象中的这些属性为undefined
时,最里面的默认值将在其位置使用。
如有疑问,try it out in the TypeScript playground。只需粘贴以下内容:
class C {
constructor(
{
validateAuthority = true,
cacheLocation = 'sessionStorage',
redirectUri = window.location.href.split("?")[0].split("#")[0],
postLogoutRedirectUri = redirectUri,
navigateToLoginRequestUrl = true
}:
{
validateAuthority?: boolean,
cacheLocation?: string,
redirectUri?: string,
postLogoutRedirectUri?: string,
navigateToLoginRequestUrl?: boolean,
} = {}) {
}
}
new C();
new C({ cacheLocation: 'asdbsgs' });