es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Diferenciando la fecha única del tipo de fecha+hora “Date” en TypeScript.

Me gustaría utilizar el sistema de tipos de TypeScript para distinguir variables que representen solo fechas (sin componente de hora) de variables con un tipo como Date que puede representar fechas con una hora (valores de “fecha y hora”).

Soy consciente, por supuesto, de que Date puede representar fechas, pero sin una distinción en el sistema de tipos creo que es más probable que confunda mis intenciones sobre fechas y fechas y horas.

Un ejemplo de un sistema que hace esta distinción es la biblioteca datetime de Python, que tiene tipos tanto date como datetime https://docs.python.org/3/library/datetime.html

Por ejemplo (pero la API no necesita ser exactamente así):


const date: OnlyDate = makeOnlyDate()
const datetime: Date = new Date()
date + datetime // error de tipo: quizás no se puede aplicar el operador '+' a los tipos 'OnlyDate' y 'Date'
let datetime2: Date = date // error de tipo: quizás el tipo 'OnlyDate' no se puede asignar al tipo 'Date'
let date2: OnlyDate = datetime // error de tipo: quizás el tipo 'Date' no se puede asignar al tipo 'OnlyDate'
date.getSeconds // error de tipo: la propiedad 'getSeconds' no existe en el tipo ...

¿Cómo puedo hacer eso? Idealmente sin implementarlo yo mismo (es decir, una solución estándar sería ideal).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para distinguir variables que representan solo fechas de variables con un tipo que puede representar valores de fecha y hora en TypeScript, se puede definir un tipo personalizado OnlyDate:

    type OnlyDate = string;
    

    Esta declaración de tipo especifica que OnlyDate es una cadena que representa una fecha sin componente de tiempo. Luego, podemos usar este tipo para anotar variables que solo deben contener fechas:

    const date: OnlyDate = '2022-01-01';
    

    Si intentamos asignar un valor de fecha y hora a una variable de tipo OnlyDate, TypeScript mostrará un error de tipo:

    const datetime: Date = new Date();
    let date2: OnlyDate = datetime;  // Error: El tipo 'Date' no se puede asignar al tipo 'OnlyDate'
    

    De manera similar, si intentamos usar una variable de fecha en un contexto que espera un valor de fecha y hora, obtendremos un error de tipo:

    date.getHours();  // Error: La propiedad 'getHours' no existe en el tipo 'OnlyDate'.
    

    Al usar un tipo personalizado, podemos indicar claramente nuestra intención de distinguir entre variables que representan fechas y variables que representan valores de fecha y hora, y aprovechar el sistema de tipos de TypeScript para detectar posibles errores. Si bien no hay una solución estándar para esto en TypeScript, definir tipos personalizados es un enfoque flexible y sencillo que nos permite expresar nuestros requisitos de dominio de manera segura en términos de tipos.

Comments are closed.