属性 'isvalid' 在类型 'KnockoutObservable' 上不存在

property 'isvalid' does not exist on type 'KnockoutObservable'

我刚开始从 javascript 切换到 typescipt。我正在使用淘汰赛,因为它必须提供明显的优势。

我需要定义一个 knockout computed observable,它依赖于另一个 knockout observable 的值。 Return 如果 observable 有效则为真,否则 return 为假。

这就是我构建代码的方式 -

class anyClass { 

    private address: KnockoutObservable<any> = ko.observable().extend({ required : true});

    private canPrintAddresses : KnockoutComputed<boolean> = ko.computed((): any => {

        if (this.address.isValid()) {    
            return true;
        }
        else
            return false;
    });
}

我什至试图在构造函数中定义计算,但编译器无动于衷。我不知道我哪里出错了,但编译器一直报错 - "property 'isValid' does not exist on type 'KnockoutObservable'".

因为我也在使用 durandal,所以我尝试在 activate 事件处理程序中定义它,但这需要在没有值附加到 observable 时在页面激活时进行评估。

请帮忙。

"address"是一个可观察变量。它存储一个对象。你应该使用

if (this.address().isValid()) {  

if (ko.unwrap(this.address).isValid()) {

为了访问存储对象的属性。

当然如果你想从一个observable中获取值,你应该把值放在observable之前,例如:

this.address({ isValid: ko.observable(true) });

编译器是正确的。在knockout中,属性 'isValid'确实不存在于KnockoutObservable上。

让我们看一下带有 knockout 的 knockout.d.ts 文件:

interface KnockoutObservable<T> extends KnockoutSubscribable<T>, KnockoutObservableFunctions<T> {
    (): T;
    (value: T): void;

    peek(): T;
    valueHasMutated?: { (): void; };
    valueWillMutate?: { (): void; };
    extend(requestedExtenders: { [key: string]: any; }): KnockoutObservable<T>;
}

interface KnockoutSubscribable<T> extends KnockoutSubscribableFunctions<T> {
    subscribe(callback: (newValue: T) => void, target?: any, event?: string): KnockoutSubscription;
    subscribe<TEvent>(callback: (newValue: TEvent) => void, target: any, event: string): KnockoutSubscription;
    extend(requestedExtenders: { [key: string]: any; }): KnockoutSubscribable<T>;
    getSubscriptionsCount(): number;
}
interface KnockoutSubscribableFunctions<T> {
    notifySubscribers(valueToWrite?: T, event?: string): void;
}

注意,没有"isValid"。

所以问题是:是什么让您认为 isValid 应该是可观察对象的有效成员?如果我不得不猜测,我猜你正在使用 knockout-validation 库,它为 knockout 添加了额外的表单验证功能。如果我猜对了,那么我也猜想您没有为该库引入类型定义文件。该库扩展了 KnockoutSubscribableFunctions<T> 接口以包含更多功能,包括 isValid().

interface KnockoutSubscribableFunctions<T> {
    isValid: KnockoutComputed<boolean>;
    isValidating: KnockoutObservable<boolean>;
    rules: KnockoutObservableArray<KnockoutValidationRule>;
    isModified: KnockoutObservable<boolean>;
    error: KnockoutComputed<string>;
    setError(error: string): void;
    clearError(): void;
}

一旦包含了这些类型定义,就可以开始了。它们在明确类型的存储库中可用:

https://github.com/borisyankov/DefinitelyTyped/blob/master/knockout.validation/knockout.validation.d.ts