You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构使用Object.create定义接口的JavaScript代码为TypeScript?

重构遗留JavaScript为TypeScript时的类型推断问题

我正在把一段遗留JS代码重构为TS,其中下面这种模式会干扰TS的类型推断,让变量X被推断为any类型:

var X = (() => {
  // ^? var X: any
  const foo = "foo string";

  function xBar() {
    console.log("xBar log");
    return 5;
  }

  return Object.preventExtensions(Object.create(null, {
    foo: {
      value: foo
    },
    bar: {
      value: xBar
    },
  }));
})();

经过排查,问题出在Object.create——它在TS里被硬编码为返回any类型,相关的GitHub议题已关闭但未说明原因。

这个any类型完全没用,我期望的推断类型应该是:

var X: {
  foo: string /* 或者更精确的 "foo string" */;
  bar: () => number;
};

我可以手动写类型定义来实现,但当Object.create里的属性值(比如foo、xBar这类)本身结构复杂甚至也是any类型时,手动写类型会非常繁琐。

请问有没有一种不改变代码行为的重构方式,不用手动编写类型就能让TS推断出期望的类型?

更新内容

  • 我发现有一个关于Object.create更精确返回类型的开放GitHub议题。
  • GitHub某条评论里的建议或许能解决我的Object.create类型问题?

*注:这里的重构指在不改变代码行为的前提下调整代码结构,目前这段代码没有自动化测试,所以改动越少越好。


内容的提问来源于stack exchange,提问作者Daniel Kaplan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:36:04