微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

绕过打字稿限制:只能使用“new”关键字调用 void 函数

如何解决绕过打字稿限制:只能使用“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 举报,一经查实,本站将立刻删除。