【发布时间】:2019-08-10 23:08:45
【问题描述】:
Knockout.js 3.5.0 在 npm 上带有它自己的类型定义。
让我们将这个变量 x 定义为:
const x: ko.Observable<boolean> = ko.computed(() => true);
现在我们得到编译器错误: “Computed”类型缺少“Observable”类型的以下属性:valueHasMutated、valueWillMutate。
我理解编译器试图告诉我什么,但我认为这主要是错误的 - 因为每个计算的也是一个可观察的。使用来自@types/knockout 的类型定义,此行为在 3.4.x 上运行良好。
有 Subscribable 类型,我认为它是某种“父”类型,它在声明中起作用:
const x: ko.Subscribable<boolean> = ko.computed(() => true);
这不会引发错误。但是没有对 value setter 执行类型检查:
x(2); // this is wrong but no compiler error
谁能解释一下这些新的类型层次结构变化以及我们应该如何使用它?
【问题讨论】:
-
没有
computed或dependantObservable类型分配给x吗?我不完全确定“每个计算的也是可观察的”在技术上是否正确。就像你提到的,我认为computed的原型是subscribable,而不是observable。 -
在带有“旧”类型的 KO 3.4 中,我们成功地将
Observable类型用作所有“更复杂”类型(如Computed)的“母亲”类型。这个想法可以从 util 函数的淘汰文档中以某种方式得出,该文档指出:ko.isObservable - 对于可观察对象、可观察数组和所有计算的可观察对象返回 true。。在新类型中,我可以清楚地看到Subscribable是Observable和Computed的父级,其子级之间没有直接关系。类型系统发生了变化有点遗憾,但是好的,我们会像往常一样适应......