如何重构使用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
相关产品推荐
相关产品推荐

