Tengo una extensión de prototipo de Date que uso en el proyecto Angular, definida como:
if (!Date.prototype.hasOwnProperty('toLocalISOString')) { Date.prototype.toLocalISOString = function (): string | null { try { const date = new Date(this.valueOf()); const a = [ { f: date.getFullYear(), pad: 4 }, { f: date.getMonth() + 1, pad: 2 }, { f: date.getDate(), pad: 2 }, { f: date.getHours(), pad: 2 }, { f: date.getMinutes(), pad: 2 }, { f: date.getSeconds(), pad: 2 }, { f: date.getMilliseconds(), pad: 3 } ]; const s = a.map(d => dftoString().padStart(d.pad, '0')); return `${s[0]}-${s[1]}-${s[2]}T${s[3]}:${s[4]}:${s[5]}.${s[6]}`; //return `${s[0]}-${s[1]}-${s[2]}T${s[3]}:${s[4]}:${s[5]}.${s[6]}Z`; //if using Z as identifier the time is considered UTC } catch { return null; } } La extensión se declara en mi archivo global.d.ts como:
export { } declare global { interface Date { toLocalISOString(): string | null; } }Con una llamada de función en un componente como se muestra a continuación:
getAllSelect(startDate?: Date, endDate?: Date) { let params = new HttpParams(); if (startDate && endDate) { const d1 = new Date(startDate).toLocalISOString() ?? ''; const d2 = new Date(endDate).toLocalISOString() ?? ''; } 'do stuff } si uso la función SIN el new Date() , es decir
const d1 = startDate.toLocalISOString() ?? ''; const d2 = endDate.toLocalISOString() ?? ''; Recibo un mensaje de error que dice que toLocalISOString is not a function a pesar de que startDate y endDate son del tipo Date ? si incluyo el new Date() , funciona según lo previsto.
¿Alguien podría arrojar algo más de luz sobre las intrincadas diferencias entre los dos métodos y por qué la extensión del prototipo no se reconoce en la Date | null instancia Date | null ?