Mi código:
function test() { let value: number; for (let i = 0; i < 10; i++) { value = i; console.log(value); } return value; } test();
Y obtuve esto:
Variable 'value' is used before being assigned
Encontré esto muy extraño, ya que había visto otros problemas similares que usaban una devolución de llamada o una Promesa o algún otro método asíncrono, mientras que yo solo usaba un bucle for síncrono.
---------------------------------- Algunas actualizaciones -------------- ----------
function test() { let value: number; for (let i = 0; i < 100; i++) { // a() is very expensive and with some effects const result = a(i) if(i===99) { value = result } } return value; }
Utilice el operador de aserción no nulo para asegurarse de que "su operando no sea nulo ni indefinido en contextos en los que el verificador de tipos no pueda concluir ese hecho".
function test() { let value!: number; for (let i = 0; i < 10; i++) { value = i; console.log(value); } return value; } test();
TypeScript no puede inferir que se ejecuta nada en el cuerpo del bucle: no verifica que i
comience en 0, y que la condición sea i < 10
, y que el cuerpo se ejecutará al menos una vez como resultado. Este comportamiento es muy similar al siguiente:
function test() { let value: number; if (Math.random() < 0.5) { value = 5; } return value; }
que produce el mismo error.
Para que TS sepa que el valor está definitivamente definido al final, debe hacerlo completamente inequívoco. Por lo general, la mejor manera de lograr esto es definiendo y asignando a la variable una vez , con const
, a través de métodos de matriz y funciones auxiliares: TS funciona mejor cuando se minimiza la reasignación.