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

React+TypeScript使用FileReader报对象可能为null错误

问题描述

使用type="file"的input元素实现JSON文件上传功能时,调用FileReader的onload环节TypeScript抛出错误:

Cannot invoke an object which is possibly 'null'(无法调用可能为null的对象)

原始出错代码如下:

const UploadCharacter = () => {
    const [data, setData] = useState<any>();

    const handleUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
        if (e.target.files) {
            const fileReader = new FileReader(); 
            fileReader.readAsText(e.target.files[0], 'UTF-8')
            fileReader.onload((e) => {  <-- 错误抛出位置
                console.log(e.target.result)
            })
        }


    }
    return (
        <div className={s.upload}>
            <input
                className={s.uploadInput}
                type="file"
                onChange={handleUpload}
            />
        </div>
    )
}
错误根因

触发错误有两个核心点:

  • API使用方式错误:FileReader.onload是事件回调属性,不是可直接执行的方法,正确用法是给该属性赋值回调函数,而非将回调作为入参直接调用onload()
  • TypeScript类型约束:TS内置的DOM类型定义中,FileReader.onload的类型为((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null,初始值为null,直接调用一个可能为null的值就会触发该类型报错。
修复方案

方案1:修正onload赋值写法(推荐)

给onload属性直接绑定回调,同时做好空值收窄,兼容TS类型校验:

const UploadCharacter = () => {
    const [data, setData] = useState<any>();

    const handleUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
        const file = e.target.files?.[0];
        if (!file) return;

        const fileReader = new FileReader(); 
        fileReader.readAsText(file, 'UTF-8');
        // 直接给onload属性赋值回调,而非调用onload
        fileReader.onload = (ev) => {
            // 收窄空值判断,避免result的类型报错
            if (typeof ev.target?.result === 'string') {
                console.log(ev.target.result);
                // JSON解析逻辑可在此处实现
                // const parsedData = JSON.parse(ev.target.result);
                // setData(parsedData);
            }
        }
    }
    return (
        <div className={s.upload}>
            <input
                className={s.uploadInput}
                type="file"
                accept=".json"
                onChange={handleUpload}
            />
        </div>
    )
}

方案2:使用addEventListener绑定事件

通过标准事件监听API绑定load事件,天然规避onload属性可能为null的类型问题:

const handleUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
    const file = e.target.files?.[0];
    if (!file) return;

    const fileReader = new FileReader(); 
    fileReader.readAsText(file, 'UTF-8');
    fileReader.addEventListener('load', (ev) => {
        if (typeof ev.target?.result === 'string') {
            console.log(ev.target.result);
        }
    })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:00:53