如何解决绕过打字稿限制:只能使用“new”关键字调用 void 函数
Typescript 对这样的代码发誓。
type Prop = {
default?: any;
get?: Function;
set?: Function;
}
type Model = {
is: string;
[key: string]: any;
}
function convertModel(model: Model) {
const obj = Object.create(null);
for (const p in model) {
if (p === 'is') continue;
const prop = model[p];
const desc = Object.create(null);
if (prop.get || prop.set) {
desc.get = prop.get;
desc.set = prop.set;
}
else if (prop.default !== undefined) {
desc.value = prop.default ?? prop.value;
}
Object.defineProperty(obj,p,desc);
}
return obj;
}
function FABRIC(model: Model) {
const name = model?.is;
const proto = convertModel(model);
const cls = class extends (this || Object) {
constructor(...args) {
super(...args);
for (const k in proto) {
Object.defineProperty(this,k,proto[k]);
}
}
};
if (name) {
Object.defineProperty(cls,'name',{ value: name });
Object.defineProperty(cls.prototype,Symbol.toStringTag,{ value: name });
}
const fn = function () {
if (!new.target)
return FABRIC.call(fn.cls,...arguments);
return new fn.cls(...arguments);
};
fn.cls = cls;
Object.defineProperty(fn,Symbol.hasInstance,{ value: (obj) => obj instanceof fn.cls });
Object.defineProperty(fn,{ value: name });
return fn;
}
// examples
const A = FABRIC({ is: 'A' });
const obj_b = new A();
const C = A({ is: 'C' });
const obj_c = new C();
console.log(obj_c instanceof C); //true
console.log(obj_c instanceof A); //true
此时 new A()
输出错误:“只能使用 'new' 关键字调用 void 函数。”
FABRIC
函数创建类,创建函数,将类绑定到函数,然后返回函数。
这个函数可以像往常一样调用,然后它会调用 FABRIC
并返回它的结果,或者通过“new”然后它会返回类的对象类型。在 JS 中一切正常,但 TS 发誓。
我如何描述函数以使其以相同的方式工作,但代码对打字稿有效,同时不禁用规则(我不想丢失提示和输入)?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。