升级到Knockout.js 3.5.0后,计算值无法分配给可观察值

f8rj6qna  于 2022-11-13  发布在  其他
关注(0)|答案(5)|浏览(177)

Knockout.js 3.5.0在npm上有它自己的类型定义。

const x: ko.Observable<boolean> = ko.computed(() => true);

现在我们得到了编译器错误:* 类型'Computed'遗漏类型'Observable'的下列属性:值已变异,值将变异 *。
我理解编译器想要告诉我什么,但我认为这主要是错误的--因为每个计算的也是可观察的。这种行为在使用@types/knockout的类型定义的3.4.x上运行得很好。
有一个Subscribable类型,我相信它是某个“父”类型,它在声明中工作:

const x: ko.Subscribable<boolean> = ko.computed(() => true);

这不会引发错误。但是,不会对值设置器执行类型检查:

x(2);    // this is wrong but no compiler error

有谁能解释一下这些新的类型层次结构的变化以及我们应该如何使用它吗?

oknwwptz

oknwwptz1#

或者,您可以在编译器选项中添加

"path" {
   ...
   "knockout": [ "node_modules/@types/knockout" ],
   ...
}

这样,您可以使用旧KO类型,直到找到更好的升级代码的方法

dxpyg8gm

dxpyg8gm2#

在Knockout 3.5.1中,我可以引用Knockout包中定义的接口PureComputed

import * as ko from 'knockout';
import { Computed, PureComputed, Observable } from 'knockout';

class MyClass
  originalComments: string;
  comments: Observable<string>;

  constructor(serverData: any) {
    this.originalComments = serverData.comments || '';
    this.comments = ko.observable(this.originalComments);
  }

  hasChanged: PureComputed<boolean> = ko.pureComputed(() => this.comments() !==  this.originalComments);
}
3xiyfsfu

3xiyfsfu3#

我自己现在正在升级到3.5.0。这是一个很大的变化,因为我们应该使用项目自带的类型文件,它改变了所有类的名称,并去掉了全局ko。我认为这些都是好东西。我对我的代码的转换很满意(嗯,除了试图让敲除验证编译)。
我遇到了你正在遇到的问题。我知道当我给一个可观察的类型化变量赋值一个计算变量时,这是一个黑客攻击,但我也知道它会很好地工作,因为接口足够接近。这次升级迫使我重新审视这个黑客攻击,并正确地处理它。下面是我现在在代码中的做法:
我知道将变量定义为一个可观察的或计算的变量:

class SomeClass {
   public value: Observable<boolean> | Computed<boolean>;
}

这允许所有其他可能正在阅读代码的开发人员知道该值可能是一个计算值,因此他们不应该盲目地为它赋值。

57hvy0tb

57hvy0tb4#

您可以像这样使用KnockoutComputed<T>

const x: KnockoutComputed<boolean> = ko.computed(() => true);
rhfm7lfc

rhfm7lfc5#

我使用一个Observable和Computed的组合作为解决方案。

InEditMode: Observable<boolean> = ko.observable(false);
InEditModeComputed: Computed<void> = ko.computed(() => {
    const result = this.ComposeMode() === EComposeMode.Edit && !this.SaveConsultatieInProgress();
    this.InEditMode(result);
});

相关问题