Búsqueda de sitios web

javascript - ¿Cómo funciona este constructor de TypeScript? ¿Un objeto por defecto?


¿Cómo funciona el último argumento de este constructor?

    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,
            } = {}) {

        ...

    }

Me parecería que toma un objeto y el objeto ha sido predeterminado si no se proporciona nada, ¿correcto?

Si quiero sobrescribir uno de los valores, digamos, cacheLocation, ¿cómo hago eso? ¿Puedo pasar { cacheLocation: 'localStorage' } o tengo que definir todas las propiedades en ese caso?

Fuente: MSAL.js

Respuesta #1

Respuestas cortas:

Me parecería que toma un objeto y el objeto ha sido predeterminado si no se proporciona nada, ¿correcto?

Correcto.

Si quiero sobrescribir uno de los valores, digamos, cacheLocation, ¿cómo hago eso? ¿Puedo pasar { cacheLocation: 'localStorage' } o tengo que definir todas las propiedades en ese caso?

Sí, puedes proporcionar solo cacheLocation y el resto obtendrá los valores predeterminados.

Explicación

Cuando se trata de valores predeterminados, necesitas ir de afuera hacia adentro.

Primero, tienes = {}. Eso significa que puedes llamar al constructor sin un objeto:

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

A continuación, tienes enlaces de propiedades de objetos con valores predeterminados, como cacheLocation='sessionStorage'. Esto significa que TypeScript intentará obtener una propiedad del objeto llamada cacheLocation. Si cacheLocation es undefined, entonces usará el valor predeterminado ('sessionStorage'), pero de lo contrario TypeScript usará lo que se haya pasado.

Eso significa que si solo pasas un objeto con validateAuthority pero no redirectUri, redirectUri obtendrá su valor predeterminado, pero validateAuthority usará lo que hayas pasado.

Todo esto se combina para una API más fácil de usar. El valor predeterminado más externo (= {}) se utilizará cuando no se proporcionen opciones. En un objeto vacío ({}), propiedades como cacheLocation y validateAuthority serán undefined. Y cuando esas propiedades sean undefined en el objeto original, se usarán en su lugar los valores predeterminados más internos.

En caso de duda, pruébalo en el playground de TypeScript. Simplemente pega lo siguiente:

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