Typescript — импортированная функция модуля, объявленная локально, но не экспортированная ошибка

#typescript #webpack

#машинописный текст #веб-пакет

Вопрос:

Я пытаюсь экспортировать, а затем импортировать некоторые функции из одного модуля (webgl.ts) в другой (main.ts). Тем не менее, я продолжаю получать эту ошибку:

 ERROR in C:UsersmynameDesktopmyProjectsblockShadowssrcclientmain.ts
./src/client/main.ts
[tsl] ERROR in C:UsersmynameDesktopmyProjectsblockShadowssrcclientmain.ts(1,10)
      TS2459: Module '"./webgl"' declares 'setup' locally, but it is not exported.

ERROR in C:UsersmynameDesktopmyProjectsblockShadowssrcclientmain.ts
./src/client/main.ts
[tsl] ERROR in C:UsersmynameDesktopmyProjectsblockShadowssrcclientmain.ts(1,17)
      TS2459: Module '"./webgl"' declares 'bufferData' locally, but it is not exported.

ERROR in C:UsersmynameDesktopmyProjectsblockShadowssrcclientmain.ts
./src/client/main.ts
[tsl] ERROR in C:UsersmynameDesktopmyProjectsblockShadowssrcclientmain.ts(1,29)
      TS2459: Module '"./webgl"' declares 'clear' locally, but it is not exported.

ERROR in C:UsersmynameDesktopmyProjectsblockShadowssrcclientmain.ts
./src/client/main.ts
[tsl] ERROR in C:UsersmynameDesktopmyProjectsblockShadowssrcclientmain.ts(1,36)
      TS2459: Module '"./webgl"' declares 'render' locally, but it is not exported.
 

Экспорт файла (webgl.ts):

 console.log("webgl.ts");

// SHADERS
import vsSource from "./shaders/vertex.glsl";

import fsSource from "./shaders/fragment.glsl";

// Canvas amp; gl
const canvas = document.getElementById("canvas")! as HTMLCanvasElement;
let gl = canvas.getContext("webgl", { premultipliedAlpha: false, antialias: true })
    ? <WebGLRenderingContext>canvas.getContext("webgl")
    : (canvas.getContext("experimental-webgl") as WebGLRenderingContext);
var ext = gl.getExtension("OES_element_index_uint");
if (!ext) {
    throw new Error(
        `ERROR: gl.getExtension('OES_element_index_uint') not supported! Lol wut, everything should support it`
    );
}
let textureAtlas: HTMLImageElement;

// Exposing and setup of webgl components
const arrayBuffer = gl.createBuffer();
const attribLocations: { [key: string]: number } = {};
const uniformLocations: { [key: string]: WebGLUniformLocation | null } = {};

setup();

async function setup() {
    console.log("Loading textureAtlas");
    textureAtlas = await loadImage();
    console.log("Running webgl setup");
    webglSetup();
}

function webglSetup() {
    // Setup
    gl.viewport(0, 0, 400, 400);
    gl.clearColor(0, 0, 1, 1);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    gl.enable(gl.BLEND);
    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
    gl.blendEquation(gl.FUNC_ADD);
    // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    // glBlendEquation(GL_FUNC_ADD);

    // program
    const program = buildProgram();
    gl.useProgram(program);

    // locations
    // attribute
    for (let i = 0; i < gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); i  ) {
        try {
            const attribName = gl.getActiveAttrib(program, i)!.name;
            attribLocations[attribName] = gl.getAttribLocation(program, attribName);
        } catch (err) {
            throw new Error(`ERROR: ${err}`);
        }
    }

    // locations
    // uniforms
    for (let i = 0; i < gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); i  ) {
        try {
            const uniformName = gl.getActiveUniform(program, i)!.name;
            uniformLocations[uniformName] = gl.getUniformLocation(program, uniformName);
        } catch (err) {
            throw new Error(`${err}`);
        }
    }

    // Data
    // prettier-ignore
    const data = [
    //  x   y           index
        0.5,    0.5,        0,  
        0.8,    0,      1,
        0.5,    0.5,        0,  
        0.8,    0,      1,
    ]

    // Buffer
    // const arrayBuffer = gl.createBuffer();
    // gl.bindBuffer(gl.ARRAY_BUFFER, arrayBuffer);
    // gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
    bufferData(data);

    // pointer
    // Vertex Positions
    gl.vertexAttribPointer(
        attribLocations["a_BlockPos"],
        2,
        gl.FLOAT, //????
        false,
        Float32Array.BYTES_PER_ELEMENT * 3,
        Float32Array.BYTES_PER_ELEMENT * 0
    );
    gl.enableVertexAttribArray(attribLocations["a_BlockPos"]);

    // UV Coords
    gl.vertexAttribPointer(
        attribLocations["a_BlockIndex"],
        1,
        gl.FLOAT,
        false,
        Float32Array.BYTES_PER_ELEMENT * 3,
        Float32Array.BYTES_PER_ELEMENT * 2
    );
    gl.enableVertexAttribArray(attribLocations["a_BlockIndex"]);

    // Textures
    gl.activeTexture(gl.TEXTURE0   0);
    const texture = buildTexture(32);
    // gl.bindTexture(gl.TEXTURE_2D, texture);

    // uniform
    gl.uniform1i(uniformLocations.u_Textures, 0);

    // drawArrays
    clear();
    render(data);
}

// FUNCTIONS
function bufferData(data: Array<number>) {
    gl.bindBuffer(gl.ARRAY_BUFFER, arrayBuffer);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
}

function clear() {
    gl.clear(gl.COLOR_BUFFER_BIT);
}

function render(data: Array<number>) {
    gl.drawArrays(gl.POINTS, 0, data.length / 3);
}

async function buildTexture(inputWidth: number) {
    try {
        const texture = gl.createTexture();
        gl.bindTexture(gl.TEXTURE_2D, texture);

        if (1) {
            const img = textureAtlas;
            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);
        } else {
            const level = 0;
            const internalFormat = gl.RGBA;
            const width = inputWidth;
            const height = 1;
            const border = 0;
            const srcFormat = gl.RGBA;
            const srcType = gl.UNSIGNED_BYTE;
            //prettier-ignore
            const pixel = new Uint8Array(createTexData(width)); // opaque blue
            gl.texImage2D(
                gl.TEXTURE_2D,
                level,
                internalFormat,
                width,
                height,
                border,
                srcFormat,
                srcType,
                pixel
            );
        }

        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);

        return texture;
    } catch (err) {
        throw new Error(`ERROR: ${err}`);
    }
}

function createTexData(numOfSteps: number = 2) {
    const tex = [];
    // tex.push(255, 0, 0, 255);
    for (let i = 0; i < numOfSteps - 1; i  ) {
        tex.push(255, 0, 0, 255 * (i / numOfSteps - 1));
        // tex.push(255, 0, 0, 255);
    }
    tex.push(255, 0, 0, 255);

    return tex;
}

function loadImage() {
    return new Promise<HTMLImageElement>((resolve, reject) => {
        const img = new Image();
        img.src = "./tilemap.png";
        img.onload = function () {
            resolve(img);
        };
        img.onerror = function (err) {
            reject(err);
        };
    });
}

// build shader
function buildShader(type: number, shaderSource: string): WebGLShader {
    try {
        const shader = gl.createShader(type)!;
        gl.shaderSource(shader, shaderSource);
        gl.compileShader(shader);

        if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
            throw new Error(`ERROR: ${gl.getShaderInfoLog(shader)}`);
        }
        return shader;
    } catch (err) {
        throw new Error(`ERROR: ${err}`);
    }
}

// build Program
function buildProgram() {
    try {
        const program = gl.createProgram()!;
        gl.attachShader(program, buildShader(gl.VERTEX_SHADER, vsSource));
        gl.attachShader(program, buildShader(gl.FRAGMENT_SHADER, fsSource));
        gl.linkProgram(program);

        gl.validateProgram(program);

        if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
            throw new Error("ERROR linking program. Info: "   gl.getProgramInfoLog(program));
        }
        if (!gl.getProgramParameter(program, gl.VALIDATE_STATUS)) {
            throw new Error("ERROR validating program. Info: "   gl.getProgramInfoLog(program));
        }
        return program;
    } catch (err) {
        throw new Error(`ERROR ${err}`);
    }
}

// export type setup = () => void;
// export type bufferData = () => void;
// export type clear = () => void;
// export type render = () => void;
export { setup, bufferData, clear, render };
 

Импорт файла (main.ts):

 import { setup, bufferData, clear, render } from "./webgl";
 

Я также использую webpack для создания bundle.js из этих двух файлов .ts.
Кто-нибудь знает, как решить эту проблему или знает, почему это происходит?

Я также пытался добавить .ts букву «а» в конец ./webgl , но это не сработало

 import { setup, bufferData, clear, render } from "./webgl.ts";
 

РЕДАКТИРОВАТЬ: я также попытался поместить ключевое слово export в начало определения функции: export function setup(){ // my code} но это не сработало

Ответ №1:

попробуйте написать export function bufferData(data: Array<number>) { insted of only function и удалить export { setup, bufferData, clear, render };

Комментарии:

1. Пожалуйста, попробуйте это. const functions = { setup, bufferData, clear, render }; export default functions; import functions from "filename";

2. Я получаю сообщение об ошибке: TS1192: Module ‘»C:\Users\myName\Desktop\myProjects\blockShadows\src\client\webgl «‘ не имеет экспорта по умолчанию. Я чувствую, что эти проблемы как-то связаны с webpack или tsconfig.

Ответ №2:

Это сообщение об ошибке означает, что setup объявлен в webgl.ts, но он не экспортируется, поэтому перейдите и напишите export перед функцией setup в ./webgl.ts.

Я предлагаю вам попробовать другой метод экспорта, написав export перед объявлением переменной или функции, например

export sync function setup(){//code}