JavaScript

How to Fix the “Expected” Error in JavaScript After Converting from TypeScript

How to Fix the “Expected” Error in JavaScript After Converting from TypeScript

I recently converted a TypeScript (TS) class into plain JavaScript (JS), and I ran into one of the most confusing yet common errors:

; expected or Expression expected

At first, I thought I must have missed a semicolon somewhere but it turned out to be something else entirely.

In this article, I’ll walk you through what caused the error, how I fixed it, and how you can avoid the same mistake when converting TS to JS.

Where the Problem Start

I began by copying my TypeScript code into a .js file, assuming it would “just work” if I removed the type annotations.

Here’s the original TS code I was working with:

export class ModelEnvironment {
    /**
     * @param filePath File path of the model.json
     * @param shader Shader ("Standard"|"OpaqueLight"|"TransparentLight")
     * @param materialName Name of the material used (Will add a number to the end if multiple colors)
     * @param color 
     */
    constructor(filePath: string, shader: shaderType, materialName: string, color: vec3) {
        const model = JSON.parse(Deno.readTextFileSync(filePath))
        let matNum = 1
        const objs = model.objects;
        const colors: vec3[] = []
        objs.forEach((x: {
            position: vec3,
            rotation: vec3,
            scale: vec3,
            shape: geoShape,
            color: vec3
        }) => {
            if (!colors.includes(x.color)) {
                colors.push(x.color);
            }

            new Environment()
                .geometry()
                .shape(x.shape)
                .material(materialName)
                .pos(x.position)
                .rot(x.rotation)
                .scale(x.scale)
                .push();
        })
        colors.forEach((x: vec3) => {
            let matName = materialName
            if (x.length > 1) matName = `${materialName + matNum}`
            new Material(matName)
                .color(color)
                .shader(shader)
                .push();
            matNum++;
        })
    }
}

My Broken JavaScript Conversion

When I rewrote the forEach callback, I mistakenly did this:

objs.forEach(x => {
	position: x.position
	rotation: x.rotation
	scale: x.scale
	shape: x.shape
	color: x.color
}) => {   // Unexpected arrow!

This is where the dreaded ; expected error appeared.

Why This Error Happens

It turns out there were two major mistakes:

  1. The arrow function is malformed. You can’t close a function and then randomly add => again.
  2. Inside an arrow function block, lines like position: x.position are treated as labels, not assignments or key-value pairs.

JavaScript only understands that syntax inside an object literal, like { position: x.position }.

The Correct JavaScript Version

Here’s the fixed and working JS code:

class geoScene {
	constructor(filePath, shader, matName, color) {

		const model = JSON.parse(fs.readFileSync(filePath))
		let matNum = 1
		const objs = model.objects;
		const colors = []

		objs.forEach(x => {
			if (!colors.includes(x.color)) {
				colors.push(x.color)
			}

			new Environment()
				.geometry()
				.shape(x.shape)
				.material(matName)
				.pos(x.position)
				.rot(x.rotation)
				.scale(x.scale)
				.push()
		})

		colors.forEach(col => {
			let currentName = matName
			if (col.length > 1) currentName = `${matName}${matNum}`

			new Material(currentName)
				.color(color)
				.shader(shader)
				.push()

			matNum++
		})
	}
}

Add Debug Logging for Practice

To make the code easier to understand while converting from TS to JS, I added some logs:

console.log("Loaded objects:", objs.length);
console.log("Unique Colors Found:", colors);

That way, I could visually confirm that my data was being processed correctly.

Final Thought

Converting TypeScript to JavaScript isn’t always a simple copy-and-paste job especially when arrow functions and type annotations are involved. What looks valid in TS can easily turn into confusing syntax errors in JS. The key lesson I learned is to slow down and clean up TS-specific syntax instead of assuming JavaScript will “figure it out.” Now that I understand why errors like ; expected happen, I can spot and fix them instantly. If you’re facing similar issues, don’t get discouraged every error is just JavaScript’s way of teaching you something new.

Rick Bowen (JavaScript)

About Rick Bowen (JavaScript)

Hi, I'm Rick! I'm an accomplished Software Engineer with broad and deep expertise in Go JavaScript, TypeScript, Shell (bash/zsh), Git, SQL & NoSQL Databases, Containers + Kubernetes, Distributed Systems, Reliability Engineering, DevOps, Cloud / Network / Application Security, Identity / Access Management, Linux, macOS/Darwin, CI/CD, SaltStack, Terraform, AWS, GCP, Azure, Internet Protocols, and much more.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments