typescript - Computed no se puede asignar a Observable después de la actualización a Knockout.js 3.5.0
Knockout.js 3.5.0 viene con sus propias definiciones de tipo en npm. Vamos a definir esta variable x como:
const x: ko.Observable<boolean> = ko.computed(() => true);
Ahora tenemos un error de compilador: Type 'Computed' is missing the following properties from type 'Observable': valueHasMutated, valueWillMutate.
Entiendo lo que el compilador está tratando de decirme, pero creo que principalmente esto está mal, porque cada computed también es un observable. Este comportamiento funcionaba bien en la versión 3.4.x usando definiciones de tipos de @types/knockout.
Está el tipo Subscribable, que creo que es algún tipo de "padre", y funciona en la declaración:
const x: ko.Subscribable<boolean> = ko.computed(() => true);
Esto no genera ningún error. Sin embargo, no se realiza ninguna verificación de tipo en el asignador de valor:
x(2); // this is wrong but no compiler error
¿Alguien puede aclarar estos cambios en la nueva jerarquía de tipos y cómo deberíamos usarla?
Respuesta #1
Estoy pasando por la actualización a la versión 3.5.0 yo mismo en este momento. Es un gran cambio ya que deberíamos estar usando el archivo de tipo que viene con el proyecto y eso cambia todos los nombres de las clases y elimina el ko global. Creo que todas estas son cosas buenas. He estado contento con la transformación de mi código (bueno, excepto por intentar hacer que knockout-validation se compile).
Me encontré con el mismo problema con el que te estás encontrando. Sabía que cuando asignaba un computado a una variable de tipo observable era un truco, pero también sabía que funcionaría perfectamente porque la interfaz era lo suficientemente cercana. Esta actualización me obligó a revisar el truco y a lidiar con él correctamente. Aquí es cómo lo hago ahora en mi código:
Ahora sé que definir la variable como una que toma ya sea un observable o un computado:
class SomeClass {
public value: Observable<boolean> | Computed<boolean>;
}
Esto permite que todos los demás desarrolladores que puedan estar leyendo el código sepan que ese valor podría ser calculado, por lo que no deberían simplemente asignarle un valor de manera ciega.
Respuesta #2
Alternativamente, puedes agregarlo en las opciones de tu compilador
"path" {
...
"knockout": [ "node_modules/@types/knockout" ],
...
}
de esa manera puedes usar los viejos tipos de KO hasta que se encuentre una mejor manera de actualizar el código
