Typescript me dice que la propiedad 'padStart' no existe en el tipo 'string'. ¿Por qué?
Cuando escribo en las herramientas de desarrollo de Chrome:
"1".padStart(2,0)
Entiendo
"01"
Pero cuando escribo
"1".padStart(2,0)
en mi proyecto de TypeScript
Entiendo
Property 'padStart' does not exist on type 'string'.
¿Por qué se queja Typescript? ¿Cómo arreglo esto?
Respuesta #1
padStart está definido en el estándar ES2017. Necesitas indicarle a TypeScript que use los tipos apropiados (los de ES2017). Puedes hacer esto configurando el objetivo a ES2017, si tu entorno de ejecución soporta todas las características del lenguaje requeridas por ES2017 (lo cual probablemente no sea el caso al momento de escribir esto).
Otra opción es simplemente configurar la opción libs para obtener los tipos para objetos en tiempo de ejecución de acuerdo con ES2017 pero aún así compilar a la versión del lenguaje que estés apuntando. (Ten en cuenta que el tiempo de ejecución en sí necesita soportar padStart, TypeScript no proporcionará ningún polyfill)
Puedes hacer esto en tsconfig usando la opción lib:
"compilerOptions": {
"target": "es2016",
"lib": [
"es2017",
"dom"
"scripthost"
],
// ...
}
Puedes leer más sobre lib vs target en esta respuesta
Respuesta #2
Para que TypeScript reconozca String.prototype.padStart(), necesitas especificar es2017 en la lista de bibliotecas en tu tsconfig.json. Si haces eso, entonces TypeScript asumirá que se pueden usar todas las características de ES2017, lo cual podría no ser exactamente lo que quieres.
Las plataformas como Node.js no siempre implementan el conjunto completo de características de una nueva especificación del lenguaje ECMAScript, por lo que es más seguro agregar únicamente las características del lenguaje en las que estés seguro de que existen. Si no estás seguro de qué características son compatibles con la plataforma que estás utilizando, puedes consultarlas en páginas como node.green o la lista de compatibilidad de navegadores de MDN.
La función padStart es parte del prototipo de String, por lo que es suficiente con agregar es2017.string en tu tsconfig.json:
{
"compilerOptions": {
"lib": ["es6", "es2017.string"],
...
},
}
Respuesta #3
TypeScript asume por defecto que tu código transpilado se ejecutará en el peor entorno posible (por ahora, espero, realmente el peor), es decir, en un navegador que solo soporta ES5. String.prototype.padStart es una función experimental soportada solo en ES2017, por lo que TypeScript no puede estar seguro de que en tiempo de ejecución estará disponible y lista.
Si sabes que este "peor caso" no aparecerá (no estás apuntando a navegadores antiguos, o estás usando polyfills), puedes hacer uno de los siguientes cambios en tu tsconfig.json:
Cambia tu objetivo de transpilación. Esto obliga a tus consumidores a tener un entorno de ejecución ES2017 (o más reciente), pero no requiere más esfuerzo de tu parte. En este caso, configura
target: "es2017".Cambia la lista de bibliotecas disponibles. En este caso, si no estás seguro de que tus clientes serán lo suficientemente modernos, debes proporcionarles polyfills para los elementos de ES2017 que estás utilizando. En este caso, agrega
"es2017"al array en el parámetrolib(si estaba vacío, entonces serálib: ["es2017"]).
