Estoy tratando de migrar lentamente a TypeScript porque lo considero una mejor alternativa que JavaScript antiguo.
Puede haber un inconveniente importante (que me di cuenta ahora) con él: no se escriben todos los atributos.
Por ejemplo:
En mi proyecto NodeJS, quiero usar el paquete npm jwt-decode. Tiene este archivo .d.ts:
export class InvalidTokenError extends Error {} export interface JwtDecodeOptions { header?: boolean; } export interface JwtHeader { type?: string; alg?: string; } export interface JwtPayload { iss?: string; sub?: string; aud?: string[] | string; exp?: number; nbf?: number; iat?: number; jti?: string; } export default function jwtDecode<T = unknown>( token: string, options?: JwtDecodeOptions ): T;Para este fragmento de código:
var decoded: JwtHeader & JwtPayload = jwtDecode(bearerToken); console.log(decoded);me sale este objeto:
{ exp: 1645637327, iat: 1645601327, jti: 'removed', iss: 'http://localhost:8080/auth/realms/supercatalog', aud: 'account', sub: 'removed', typ: 'Bearer', azp: 'restapi', session_state: '2434f33d-73c4-4f38-8c80-e92356380ffa', acr: '1', 'allowed-origins': [ '' ], realm_access: { roles: [ 'app-elev', 'offline_access', 'uma_authorization', 'default-roles-supercatalog' ] }, resource_access: { restapi: { roles: [Array] }, account: { roles: [Array] } }, scope: 'email profile', sid: 'removed', email_verified: false, preferred_username: 'elev' }Necesito obtener acceso a resource_access -> restapi -> roles.
Ahora, el problema es que no está escrito y no puedo acceder a él. Si trato de console.log (decoded.resource_access) no funcionará.
Entonces, mi pregunta es la siguiente:
¿Cómo manejarías esta situación? ¿Cual es la solución?
Estoy pensando en:
crear otra interfaz que implemente JwtPayload pero que tenga más atributos de los que necesito; no me gusta esto, llevaría mucho tiempo hacerlo cada vez, creo
use decodificado como un objeto JS simple y acceda a cualquier cosa que quiera fácilmente; tampoco me gusta esto, anula todo el propósito de TS.
¿Cómo se puede gestionar una situación así?
Gracias.
// describe your custom fields interface MyJwt extends JwtHeader, JwtPayload { realm_access: { roles: string[] // a union of known types would be more relevant // provided that it is a fixed list } } // as a good practice don't use var, but const // and if it appears that you have to change it, switch to let const decoded = jwtDecode<MyJwt>(bearerToken); // or : const decoded: MyJwt = jwtDecode(bearerToken); // decoded has the expected type console.log(decoded.realm_access.roles);