这个TypeScript构造函数如何工作?默认对象?

时间:2017-07-19 22:03:23

标签: javascript typescript ecmascript-6

这个构造函数的最后一个参数是如何工作的?

    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

1 个答案:

答案 0 :(得分:1)

简答:

  

在我看来,如果没有提供任何内容,它会占用一个对象并且该对象已被默认,对吗?

正确。

  

如果我想覆盖一个值,比如cacheLocation,我该怎么做?我可以通过{ cacheLocation: 'localStorage' }还是必须在这种情况下定义所有属性?

是的,您可以只提供cacheLocation,其余的将获得默认值。

解释

当涉及默认值时,您需要从out到in。

首先,你有= {}。这意味着您可以在没有对象的情况下调用构造函数:

new Whatever("hello", "world");

接下来,您具有默认值(例如cacheLocation = 'sessionStorage')的对象属性绑定。这意味着TypeScript将尝试从名为cacheLocation的对象中获取属性。如果cacheLocationundefined,那么它将使用默认值('sessionStorage'),否则TypeScript将使用传入的内容。

这意味着如果您只传入validateAuthority但不传递redirectUri的对象,redirectUri将获得其默认值,但validateAuthority将使用您传入的任何内容。

所有这些都汇集在一起​​,以便更易于使用的API。当没有给出选项时,将使用最外面的默认值(= {})。在空对象({})中,cacheLocationvalidateAuthority等属性将为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' });