FizzBuzz, the engineering smoke test that quickly reveals if somebody is drastically under qualified in their development abilities.

Even if you’re unfamiliar with the exercise, most are able to make short work of it. It only leverages a small handful of programming concepts that even the most novice developer should be comfortable with.

That said, I’ve never actually been given this particular coding challenge when applying for jobs. Most of the time I’ve been given small real world tasks that are somewhat indicative of the work I’d be doing on a daily basis.

And then sometimes I’ve been asked to build a linked list in Ruby…

…for a PHP role.

With that, I do like the challenge because it’s simple enough for me to implement in different languages that I am playing with and learning.

Most recently, I have been dabbling with TypeScript thought it would be fun to write a FizzBuzz in it as best as I can with my very limited experience with the syntax.

Also, TypeScript 3.0 was dropped recently, another good reason to mess around with it as my experience thus far had been with TypeScript 2.9.

Not the first time I’ve hopped on a language just before a major version was released. Looking at you PHP 3.0.

Another contributing factor to wanting to do this coding challenge in TypeScript is that a buddy of mine that’s recently started using it said that FizzBuzz would take hours.

I know he was exaggerating, but still, CHALLENGE ACCEPTED!

Before I get into the actual code, it’s probably worth mentioning what the code should be doing for a FizzBuzz. A successfully written FizzBuzz should do the following:

  • Loop through numbers 1 to 100 (generally speaking on the upper limit)
  • Print the word “Fizz” if the number is divisible by 3
  • Print the word “Buzz” if the number is divisible by 5
  • Subsequently print “FizzBuzz” if the number is divisible by 3 and 5
  • Otherwise, just print out the current number

Depending on who’s issuing the challenge, they may expect the values to be comma separated. For the sake of this post, I’m just dumping the values out with console.log() each being on a new line.

Also, before we dig into the code, be sure you have typescript installed so you can actually run this:

# via npm
npm install typescript -g
# via yarn
yarn global add typescript

You could also install typescript to your project instead of globally (which is how I prefer to do things).

With typescript installed you will have access to tsc which we will use to compile our TypeScript file into good ol’ JavaScript.

All right, let’s jump into the FizzBuzz code:

fizzbuzz.ts

let divBy3: boolean;
let divBy5: boolean;
let i: number;
let output: string;

for (i = 1; i <= 100; i += 1) {
  output = '';
  divBy3 = !(i % 3);
  divBy5 = !(i % 5);

  if (divBy3) output += 'Fizz';
  if (divBy5) output += 'Buzz';

  // Converts to a string because output is defined as such
  if (!(divBy3 || divBy5)) output = i.toString();

  console.log(output);
}

Not much too it, just a simple loop, a few sanity checks and a small bit of output. The key thing to note is that the variable definitions all have their type declared.

Because this isn’t valid JavaScript, running node fizzbuzz.ts is going to crap out and complain about the unexpected colon on the very first line.

Never fear! We can use tsc to compile the TypeScript to JavaScript:

tsc fizzbuzz.ts

Then run the compiled JavaScript file with node:

node fizzbuzz.js

Which will dump out our results which should look something like this:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
...

Took me longer to write this post than it did the actual FizzBuzz code. Definitely didn’t take hours, but I’m sure I could have went significantly deeper in regard to utilizing classes and interfaces versus just the code logic.

To help matters a bit, partly because I’m new to TypeScript and partly because it’s good to have something automated checking your code, I used tslint.

Linting is always a good thing to do to help keep your code consistent with your coding style guide but also becomes a learning tool when working with a language or syntax you may not be familiar with.