Nano Hash - криптовалюты, майнинг, программирование

свойство «isvalid» не существует для типа «KnockoutObservable»

Я только начал переходить с javascript на typecipt. Я использую нокаут из-за очевидных преимуществ, которые он может предложить.

Мне нужно определить нокаутирующую вычисляемую наблюдаемую, которая зависит от значения другой нокаутирующей наблюдаемой. Возвратите 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;
    });
}

Я даже пытался определить вычисляемое внутри конструктора, но компилятору все равно. Я не знаю, где я ошибаюсь, но компилятор продолжает выдавать ошибку - "свойство isValid не существует для типа KnockoutObservable".

Поскольку я также использую durandal, поэтому я попытался определить его внутри обработчика события активации, но тогда это требует выполнения оценки при активации страницы, когда к наблюдаемому не привязано значение.

Пожалуйста помоги.


Ответы:


1

Компилятор правильный. В нокауте свойство isValid действительно не существует в KnockoutObservable.

Давайте взглянем на файл Knockout.d.ts, который поставляется вместе с Knockout:

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 должен быть действительным членом наблюдаемого объекта? Если бы мне пришлось угадывать, я бы предположил, что вы используете библиотеку проверки нокаута, которая добавляет дополнительные функции для проверки формы в нокаут. Если я правильно предполагаю, то я также предположил бы, что вы не принесли файлы определений типов для этой библиотеки. Эта библиотека расширяет интерфейс 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

09.10.2015
  • классно. установка пакета -knockout.validaion.TypesScript.DefinitelyTyped сделала свое дело. Спасибо Шон!!! 12.10.2015
  • Хм. Что ж, у меня есть проверочные типы, но мое решение все еще не собирается. У меня есть другое решение, в котором также есть типизация Knockout и Knockout.validation, те же версии, и оно строится. Что за?! 16.09.2017

  • 2

    «Адрес» — это наблюдаемая переменная. Он хранит объект. Вы должны использовать

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

    or

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

    для доступа к свойствам сохраненного объекта.

    Конечно, если вы хотите получить значение из наблюдаемого, вы должны поместить значение в наблюдаемое раньше, например:

    this.address({ isValid: ko.observable(true) });
    
    08.10.2015
  • Почему this.address.isValid() работает в javascript, а не в машинописном? 08.10.2015
  • Это зависит от того, что вы назначаете this.address. Возможно, observable перезаписывается командой this.address = addressValue где-то в коде. Не могли бы вы предоставить код, иллюстрирующий проблему? 08.10.2015
  • Я думаю, это больше связано с определенно типизированной библиотекой для нокаута. В this.address.isValid() возникает ошибка времени компиляции, и, к сожалению, ваше предложение также не сработало :( 09.10.2015
  • this.address.isValid() должен генерировать ошибку компиляции из-за того, что this.address является KnockoutObservable, у которого нет свойства isValid. this.address().isValid() правильно ИМХО. Если это не работает для вас, мне нужен пример кода, иллюстрирующий проблему. 09.10.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..