问题描述
属性“ 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'})
感谢您的帮助或建议,
我想要一个有效的解决方案,该解决方案可以使工作流程顺畅,无重复
如果是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 :)