javascript - La propiedad 'replace' no existe en el tipo 'IData'. ¿Qué falta?
Estoy intentando crear una función de conversión donde se recibe una cadena con números como entrada, pero al usar la función regex "replace()", no la reconoce.
¿Alguien sabe cómo puedo declarar "replace()" dentro del tipo IData?
interface IData{
data:string | {
replace: (()=>number),
};
}
class Cast{
castString(data:IData){
return data.toString();
}
castNumber(data:IData){
return data.replace(/\D+/g, '');
}
}
export default new Cast;
Respuesta #1
Basado en los comentarios hasta ahora, creo que hay necesidad de explicar brevemente los tipos en JS (lo cual se traduce también a TS).
Los tipos primitivos en JavaScript (por ejemplo, string, number y boolean) no son objetos con funciones, sino solo valores. Las funciones que puedes llamar sobre ellos (como replace para un string) son en realidad de los llamados Tipos Envoltorio. Son la contraparte en objetos de los primitivos. Pueden usarse para convertir explícitamente (Number("123")) o para envolver el primitivo en un objeto (new Number(123)).
Se debe evitar lo último, porque esto se hace automáticamente por JS cuando es necesario. Como en tu caso:
"34bbb5".replace(...)se cambia anew String("34bbb5").replace(...)detrás de escena
¿Cómo ayuda esta información?
Con eso en mente, tu objetivo parece ser definir un tipo de cadena que tenga una definición diferente de la función replace. La nueva definición estaba destinada a cambiar el comportamiento de la función String.replace. El problema es que es solo una definición. Por lo tanto, no afecta a la función real String.replace.
¿Cuáles son tus opciones?
Una interfaz de TypeScript es solo una definición presente en tiempo de compilación. Por lo tanto, al sobrecargar la definición de la función replace no se obtiene ningún cambio de código. En consecuencia, la siguiente definición de interfaz debería adaptarse perfectamente a su caso.
interface IData {
data:string
}
Tu clase Cast parece tener la tarea de convertir el IData ya sea a una cadena o a un número. La primera es bastante simple, ya que significa simplemente devolver el valor del atributo data.
Usaste el método
toString()del objeto que cumple con la interfazIData. Esto en realidad llama a la funciónObject.toString()lo que resulta en"[object Object]".
El segundo método de conversión debe devolver un número. Aquí ya proporcionaste la mayor parte del código, pero te olvidaste de llamarlo en el atributo data (como señaló @jcalz). Entonces, deberías llamarlo en el atributo data y realmente convertirlo a un número. Puedes usar + o Number() o parseInt() para esto. Como solo tienes números en la cadena, no hay diferencia en el comportamiento.
El resultado se vería así:
interface IData{
data:string;
}
class Cast{
castString(data:IData){
return data.data.toString();
}
castNumber(data:IData){
return Number(data.data.replace(/\D+/g, ''));
}
}
export default new Cast;
Consejo
También podrías usar desestructuración de objetos si quieres
castString({data}: IData){
return data.toString();
}
