React TypeScript:类型“null”不可分配给类型“CanvasRenderingContext2D”

Bil*_*ill 1 canvas typescript reactjs

我似乎能够创建画布,但是当我获得上下文时

  const resizeImage = async (maxSize: number) => {
    const image = originalImage;
    const id = positionId;
    const resizeCanvas = document.createElement('canvas');
    resizeCanvas.width = maxSize;
    resizeCanvas.height = maxSize;
    const ctx: CanvasRenderingContext2D = resizeCanvas.getContext('2D');
//         ^ Error
    ...
Run Code Online (Sandbox Code Playgroud)

错误是

Type 'CanvasRenderingContext2D | ImageBitmapRenderingContext | WebGLRenderingContext | WebGL2RenderingContext | null' is not assignable to type 'CanvasRenderingContext2D'.
  Type 'null' is not assignable to type 'CanvasRenderingContext2D'.ts(2322)
Run Code Online (Sandbox Code Playgroud)

Col*_*rre 5

错误意味着resizeCanvas.getContext('2D')可以返回空值,但是您将它分配给一个类型的变量CanvasRenderingContext2D(即这不能为空值)。因此,您需要在分配之前确保结果不为空。另外我想你想确保它是类型CanvasRenderingContext2D而不是ImageBitmapRenderingContext等。你可以这样做:

 const resizeImage = async (maxSize: number) => {
    const image = originalImage;
    const id = positionId;
    const resizeCanvas = document.createElement('canvas');
    resizeCanvas.width = maxSize;
    resizeCanvas.height = maxSize;
    const res = resizeCanvas.getContext('2D');
    if (!res || !(res instanceof CanvasRenderingContext2D)) {
        throw new Error('Failed to get 2D context');
    }
    const ctx: CanvasRenderingContext2D = res;
Run Code Online (Sandbox Code Playgroud)