Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeScript compiler evaluates let differently than const

Tags:

typescript

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?

like image 218
Bert Porter Avatar asked Jan 23 '20 21:01

Bert Porter


1 Answers

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.

like image 69
ford04 Avatar answered Oct 23 '22 07:10

ford04