【问题标题】:property 'isvalid' does not exist on type 'KnockoutObservable'“KnockoutObservable”类型上不存在属性“isvalid”
【发布时间】:2016-01-05 22:45:41
【问题描述】:

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

我需要定义一个淘汰赛计算的 observable,它取决于另一个淘汰赛 observable 的值。如果 observable 有效则返回 true,否则返回 false。

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

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,所以我尝试在激活事件处理程序中定义它,但这需要在没有附加到可观察对象的值时对页面的激活进行评估。

请帮忙。

【问题讨论】:

    标签: javascript knockout.js typescript durandal definitelytyped


    【解决方案1】:

    编译器是正确的。在淘汰赛中,KnockoutObservable 上确实不存在属性“isValid”。

    让我们看一下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 应该是 observable 上的有效成员?如果我不得不猜测,我猜你正在使用敲除验证库,它为敲除表单验证添加了额外的功能。如果我猜对了,那么我也猜想您没有为该库引入类型定义文件。该库扩展了KnockoutSubscribableFunctions&lt;T&gt; 接口以包含更多功能,包括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

    【讨论】:

    • 太棒了。安装包 - knockout.validaion.TypesScript.DefinitelyTyped 成功了。谢谢肖恩!!!
    • 嗯。好吧,我有验证类型,但我的解决方案仍然无法构建。我有另一个解决方案,它也有 knockout 和 knockout.validation 分型,相同的版本,并且可以构建。什么?!
    【解决方案2】:

    “地址”是一个可观察的变量。它存储一个对象。你应该使用

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

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

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

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

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

    【讨论】:

    • 为什么 this.address.isValid() 在 javascript 中有效,在 typescript 中无效?
    • 这取决于您分配给“this.address”的内容。可能 observable 被代码中某处的“this.address = addressValue”命令覆盖。你能提供一些代码来说明问题吗?
    • 我想这更多地与用于淘汰赛的绝对类型库有关。 this.address.isValid() 抛出编译时错误,不幸的是,您的建议也没有奏效:(
    • "this.address.isValid()" 应该会产生编译错误,因为 "this.address" 是一个 KnockoutObservable,它没有 "isValid" 属性。 “this.address().isValid()”是正确的恕我直言。如果它不适合你,我需要一个示例代码来说明问题。
    猜你喜欢
    • 2021-01-09
    • 2021-07-10
    • 2017-07-22
    • 2023-03-26
    • 2023-04-02
    • 2019-12-20
    • 2021-12-07
    • 2016-03-14
    相关资源
    最近更新 更多