Отключите изменение «Тип свойства циклически ссылается на себя в сопоставленном типе» или обходной путь

#javascript #visual-studio-code #types #eslint #jsdoc

#javascript #typescript #visual-studio-code #eslint #jsdoc

Вопрос:

как я могу отключить такого рода ошибки во всем моем проекте или, может быть, обойти их?

Тип свойства ‘UID’ циклически ссылается на себя в сопоставленном типе ‘Partial’.ts(2615)

введите описание изображения здесь

Итак, здесь проблема с js и vscode. Если я говорю, что тип данных — /** @param {A} [data] */ ошибка из new A({}) экземпляра, мне нужно полностью заполнить частичный объект, иначе я получу ошибку linter!

введите описание изображения здесь

если я скажу, что тип данных является частичным объектом obj /** @param {Partial<A>} [data] */ , теперь new A({}) все работает нормально, но я получаю ошибку linter для конструктора!

введите описание изображения здесь

И если я скажу /** @param {A|Partial<A>} [data] */ , больше никаких ошибок! но все реквизиты стали неопределенными (любыми) и потеряли типы!!! Vscode IntelliSense кажется немного потерянным в этом случае. !

введите описание изображения здесь


вот пример кода, как я могу сказать, что данные являются частичным объектом, но если ничего, по умолчанию установлено!!!!

тестовый пример: /** @param {A} [data]*/ /** @param {Partial<A>} [data] */ /** @param { A | Partial<A>} [data] */

 export class A {
    /** @param {Partial<A>} [data] */ // how say is partial and also default ? 
    constructor(data) {
        /** uid global du data */
        this.UID = data.UID || 'noUID';
        this.prop = data.prop || {};
    }
    get VIEW() {
        return this.constructor.name;
    }
}

const a = new A ({UID:'g42t'})
  

Спасибо за любую помощь или предложение,

Я хотел бы эффективное решение, которое позволяет иметь хороший рабочий процесс без повторений

я также открываю проблему здесь, если это ошибка? https://github.com/microsoft/vscode/issues/108062

Ответ №1:

Не уверен, почему вы никогда не помечали этот машинописный текст. 🙂

Но частичная часть класса здесь на самом деле не имеет особого смысла, обычно источником истины является какой-то интерфейс / тип, предполагаемые типы, конечно, выводятся только из какого-то конкретного типа. Здесь вы не указали своему классу какие-либо конкретные типы, поэтому Typescript попытается сделать вывод и потерпит неудачу по очевидным причинам, но даже если это не так, это не будет очень полезно, например. я думаю, что это будет readonly VIEW() не то, что я думаю, после того, как вы действительно хотите, чтобы иметь возможность отправлять необязательное readonly View() ??.

Итак, простое решение, просто укажите данные, которые вы ожидаете.

например.

 export class A {
    /** @param {{UID?:string, prop?:object}} [data] */ 
    constructor(data) {
        /** uid global du data */
        this.UID = data.UID || 'noUID';
        this.prop = data.prop || {};
    }
    get VIEW() {
        return this.constructor.name;
    }
}

const a = new A ({UID:'g42t'})
  

Комментарии:

1. Хм, это то, чего я хотел избежать!, набираю все intellisenses вручную в jsdoc. Плохо для (рабочего процесса) и требует повторного кода. Но я нашел чудесное решение, в котором все работает почти автоматически. ! /** @param {Partial<Omit<A, 'UID'>>} [data] */ и затем добавьте значение по умолчанию в общедоступное пространство и пометьте /**@readonly - UID */ , если необходимо!. Кажется, теперь все работает нормально! спасибо за ваше время.

2. я не могу пометить typescript, потому что это максимум 5 тегов, поэтому извините, я не могу это исправить.

3. @jon Я бы удалил типы и вставил typescript. Я думаю, у вас было бы больше ответов от сообщества typescript, чем только у меня.

Ответ №2:

хорошо решено, intellisense отлично работает с такой структурой. спасибо всем.

Немного некрасиво для глаз, но это нормально и доступно для всех родительских конструкторов расширений.

 export class A {

    /**@readonly - UID ...desc */
    UID = UTILITY.create_UID();
    /**@readonly - UID2 ...desc */
    UID2 = '';
    /** @param {Partial<Omit<A, 'UID'>>} [data] */
    constructor(data,{UID2}=data) {
        this.UID2 = UID2 || 'perform default thing...';
    }
}

const a = new A ({UID2:'sada'}); // intellisence will not suggest UID here :)
  

Комментарии:

1. Я немного смущен тем, что это должно решить !!, был ли ПРОСМОТР пропал?. Почему у нас теперь есть UID2. этот код не похож на оригинал. TS жалуется на меня: (

2. @Keith Я согласен, и мне жаль, если я не понял свою проблему, если бы я скопировал исходный код, люди жаловались бы на сокращение кода 🙂 , и, к сожалению, это самая простая версия моей структуры, которую я могу предоставить. И извините VIEW , что это не имеет к этому никакого отношения, это было временное исправление, потому что в настоящее время я конвертирую весь свой проект в React и Store proxy. Так что здесь есть немного странный код. На самом деле, используя какой-то хак, смешанный с публичной, частная структура работает нормально! developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…