Following page 64 in Boris Cherny's Programming TypeScript, consider a JavaScript function like this:
function warnUser(warning) {
if (warnUser.wasCalled) {
return
}
warnUser.wasCalled = true
alert(warning)
}
warnUser.wasCalled = false
which will warn a user no more than once. We want to use TypeScript to type its full signature:
type WarnUser = {
(warning: string): void
wasCalled: boolean
}
Then we can implement it in TypeScript like so:
const warnUser: WarnUser = (warning) => {
if (warnUser.wasCalled) {
return
}
warnUser.wasCalled = true
alert(warning)
}
but try the same thing with let
instead of const
and you get an error:
let warnUser: WarnUser = (warning) => {
if (warnUser.wasCalled) {
return
}
warnUser.wasCalled = true
alert(warning)
}
Property 'wasCalled' is missing in type '(warning: string) => void' but required in type 'WarnUser'.ts(2741)>
Why is let
problematic but const
fine?
Function property assignments are only allowed on function declarations and const
variables initialized with a function/arrow expression. This is a rule ingrained in the compiler, as described in the TS 3.1 changelog.
Why is let problematic but const fine?
Probably because of safety reasons. let
creates a mutable binding, so you potentially could have reassigned another value before and aren't setting a property on the function expression anymore.
TS also forbids double function declarations, therefore both rules can be statically analyzed and enforced in a predictable way.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With