为何new File()在jsdom返回空对象,Chrome控制台却为有效File?
问题原因及解决办法
核心原因:环境差异导致的File对象表现不同
- Chrome浏览器原生完全支持File API,控制台会特殊格式化显示File对象的所有可访问属性(比如
name、type、size),所以你能看到完整的File实例信息。 - TypeScript Playground的运行环境(或你的测试代码环境,比如Node.js)要么没有原生实现浏览器的File API,要么实现方式中File对象的核心属性是不可枚举的:直接打印对象时,不可枚举属性不会被输出,看起来像空对象,但实际上对象的属性和方法是存在的。
验证方式
你可以在TS Playground里尝试访问File对象的具体属性,而不是直接打印整个对象:
const file = new File(['(⌐□_□)'], 'chucknorris.png', { type: 'image/png' }); console.log(file.name); // 输出 "chucknorris.png" console.log(file.type); // 输出 "image/png" console.log(file.size); // 输出对应数据的大小
这样就能确认对象其实是有效的,只是打印方式导致显示为空。
适配非浏览器环境的方案
如果你的测试代码运行在Node.js环境(TS Playground默认可能用的是Node模拟环境),原生Node.js并不支持浏览器的File构造函数,通常需要:
- 使用
Buffer或Blob结合自定义属性模拟File对象; - 引入第三方库来提供完整的File API实现;
- 用
jsdom等工具模拟浏览器环境,让代码能在Node中运行浏览器API。
内容的提问来源于stack exchange,提问作者Bartosz Ciach
相关产品推荐
相关产品推荐

