如何声明其他JavaScript上下文全局对象类型的变量?
如何声明其他JavaScript上下文全局对象类型的变量?
嘿,我完全get到你的需求了:你想声明一个变量,它的类型对应另一个JavaScript上下文的全局对象——这个对象得包含所有JS原生的内置对象,但不能带上当前globalThis里你自己加的自定义属性(就像你例子里的abc,这个属性是你当前上下文加的,不想让它出现在目标类型里)。
这里有几个实用的方案,用JSDoc就能实现:
方案一:针对特定环境用内置全局接口
如果你知道目标上下文的环境(比如浏览器或者Node.js),直接用对应的原生全局类型就行,这些类型只包含JS自带的属性,不会带上你自定义的内容:
- 要是目标是浏览器环境:
/** @type {Window} */ var otherContextGlobal = <...>;
- 要是目标是Node.js环境:
/** @type {NodeJS.Global} */ var otherContextGlobal = <...>;
方案二:跨环境通用的纯净全局类型
如果需要跨环境通用的方案,而且你的编辑器(比如VSCode)支持TypeScript的语言服务,那可以用Omit工具类型把当前globalThis上的自定义属性去掉,得到纯净的原生全局类型:
globalThis.abc = 123; // 把当前globalThis上的abc属性排除掉,只保留原生属性 /** @type {Omit<typeof globalThis, 'abc'>} */ var otherContextGlobal = <...>;
要是自定义属性太多,不想一个个列,还有个小技巧:通过类型推导只保留原生的全局属性:
// 先定义一个只保留原生全局属性的类型 type PureGlobal = { [K in keyof typeof globalThis]: typeof globalThis[K] }; /** @type {PureGlobal} */ var otherContextGlobal = <...>;
或者更简单的,用Proxy的目标类型来间接获取纯净的全局对象类型:
/** @type {ConstructorParameters<typeof Proxy>[0]} */ var otherContextGlobal = <...>;
方案三:手动按需声明原生对象
如果你只需要用到特定的几个原生对象,也可以手动写类型,精准控制:
/** @type {{ Object: typeof Object, Array: typeof Array, String: typeof String, // 想要啥原生对象就加啥 }} */ var otherContextGlobal = <...>;
这样处理后,变量的类型就只会包含JavaScript原生的内置对象,不会带上当前上下文的自定义属性啦。
备注:内容来源于stack exchange,提问作者user2771324
相关产品推荐
相关产品推荐

