TypeScript offers certain advantages over JavaScript. Compile time type-checking can catch a lot of errors, it can move faster than browsers, so it offers the latest standards (and the compiler handles the nasty details of shimming them into browsers), plus it has a layer of convenient, syntactic sugar.
If you’re using TypeScript, you can use the compiler to find all sorts of ugly problems with your code, and all you need to do is turn the right flags on.
Or, you can be like Quintus’s co-worker, who checked in this… thing.
/**
* Container holding definition information.
*
* @param String version
* @param String date
*/
export class Definition {
private id: string;
private name: string;
constructor(private version, private data) {}
/**
* get the definition version
*
* @return String version
*/
getVersion() {
return this.id;
}
/**
* get the definition date
*
* @return String date
*/
getDate() {
return this.name;
}
}
Now, if you were to try this on the TypeScript playground, you’d find that while it compiles and generates JavaScript, the compiler has a lot of reasonable complaints about it. However, if you were just to compile this with the command line tsc
, it gleefully does the job without complaint, using the default settings.
So the code is bad, and the tool can tell you it’s bad, but you have to actually ask the tool to tell you that.
In any case, it’s easy to understand what happened with this bad code: this is clearly programming by copy/paste. They had a class that tied an id
to a name
. They copy/pasted to make one that mapped a version
to a date
, but got distracted halfway through and ended up with this incomplete dropping. And then they somehow checked it in, and nobody noticed it until Quintus was poking around.
Now, a little bit about this code. You’ll note that there are private
id
and name
properties. The constructor
defines two more properties (and wires the constructor params up to map to them) with its private version, private data
params.
So if you call the constructor, you initialize two private members that have no accessors at all. There are accessors, but they point to id
and name
, which never get initialized in the constructor, and have no mutators.
Of course, TypeScript compiles down into JavaScript, so those private
keywords don’t really matter. JavaScript doesn’t have private.
My suspicion is that this class ended up in the code base, but is never actually used. If it is used, I bet it’s used like:
let f = new Definition();
f.id = "1.0.1"
f.name = "28-OCT-2020"
…
let ver = f.getVersion();
That would work and do what the original developer expected. If they did that, the TypeScript compiler might complain, but as we saw, they don’t really care about what the compiler says.