禁用警告“属性类型以映射类型循环引用自身”或解决方法

问题描述

我如何在我的整个项目或解决方法中禁用这种错误

属性“ UID”的类型以映射类型循环引用自身 'Partial'.ts(2615)

enter image description here

所以这是js和vscode的问题。 如果我说数据类型为/** @param {A} [data] */ 错误来自new A({})实例,我需要完全填充部分对象,否则我会得到linter错误

enter image description here

如果我说数据类型是部分obj /** @param {Partial<A>} [data] */,那么现在new A({})可以正常工作,但是构造器出现linter错误

enter image description here

如果我说/** @param {A|Partial<A>} [data] */ ,就不会再有错误了!但是所有道具变成不确定的(任何)并且丢失了类型! 在这种情况下,Vscode IntelliSense似乎有点丢失。 !

enter image description here


这里是示例代码,我怎么能说数据是部分对象,但是如果没有,则设置认值!!!!

测试案例: /** @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'})

感谢您的帮助或建议,

我想要一个有效的解决方案,该解决方案可以使工作流程顺畅,无重复

如果是bug,我也在这里公开问题? https://github.com/microsoft/vscode/issues/108062

解决方法

不确定为什么也从未标记过该Typescript。 :)

但是这里的部​​分类并没有多大意义,通常类型的真相来源是某种接口/类型,当然,推断的类型只能从某种具体的类型推断出来。在这里,您没有为您的类提供任何具体的类型,因此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'})
,

好的解决了,智能感知就可以用这种结构工作。谢谢大家。

有点丑陋,但是它对所有父级扩展构造函数都很好并且可以使用。

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 :)