开发者问题收集

Canvas .tsx - 对象可能为“null”,并且属性“getContext”在类型“never”上不存在

2022-06-12
2174

我正在尝试创建一个可以放置在我的应用程序中的画布组件。

最终我会让用户可以在其上绘图。

错误出现在此行:

const context = canvas.getContext("2d");

对象可能为“null”

如果我将其更改为:

const context = canvas?.getContext("2d");

我得到:

属性“getContext”在类型“never”上不存在

这是该组件的完整代码:

const Canvas = (props: CanvasProps) => {
  const canvasRef = useRef(null);

  useEffect(() => {
    const canvas = canvasRef.current;
    const context = canvas.getContext("2d");
    //Our first draw
    context.fillStyle = "#000000";
    context.fillRect(0, 0, context.canvas.width, context.canvas.height);
  }, []);

  return <canvas ref={canvasRef} {...props} />;
};

export default Canvas;
1个回答

我试了几次,得到这个解决方案:

const Canvas = (props: CanvasProps) => {
  const canvasRef = useRef<HTMLCanvasElement>(null);

  useEffect(() => {
    const canvas = canvasRef.current;
    if (canvas == null) return; // current may be null
    const context = canvas.getContext("2d");
    if (context == null) return; // context may be null
    //Our first draw
    context.fillStyle = "#000000";
    context.fillRect(0, 0, context.canvas.width, context.canvas.height);
  }, []);

  return <canvas ref={canvasRef} {...props} />;
};

export default Canvas;

首先,使用 useRef<HTMLCanvasElement>(null) 让 TS 知道 useRef 获取了一个 HTML Canvas Element

根据 React useRef 文档,useRef() 在渲染之前结果为 null,因此我们添加 if (canvas == null) return; 以避免它为 null;

根据 getContext() 文档 ,结果可能为 null,因此我们添加 if (context == null) return;

可执行代码为 这里

xubeiyan
2022-06-14