TypeScript function signatures
Here are four different ways to define a typed function in TypeScript.
//A
const strLen: (str: string) => number = str => {
return str.length;
}
//B
type StrLenType = (str: string) => number
const strLen: StrLenType = str => {
return str.length;
}
//C
const strLen = (str: string): number => {
return str.length;
}
//D
function strLen(str: string): number {
return str.length;
}
All of these are syntactically valid, but which would you choose?
Personally, I dislike options A and B. I find A very hard to read and whilst I find B easier to read than A, it feels unnecessary.
I like C and D because the description of the parameters and the return type is where I expect them to be. I guess it is familiarity with other languages.
I have tended to shy away from classes in JavaScript, in part out of a desire to be more functional. Having spent some time using Scala, I think I've come around to blending functional ideals with classes and I think in TypeScript it works well. This tends to mean I moved to preferring D as a general convention.
I will sometimes still use C, when writing smaller utility functions. I've deliberated ignored the implicitly return option for the example above, but if I was writing a function in the style of option C, I would write:
const strLen = (str: string): number => str.length;
