функция со свойством, которое будет добавлено позже

#typescript

#typescript

Вопрос:

Это пример из книги «Программирование на машинописи» Бориса Черного:

 type WarnUser = {
  (warning: string): void
  wasCalled: boolean
}

let warnUser: WarnUser = (warning: string) => {
  if (warnUser.wasCalled) {
    return
  }
  warnUser.wasCalled = true
  alert(warning)
}
warnUser.wasCalled = false
 

У нас есть функция со свойством, которое будет добавлено после создания функции. Когда я помещаю этот код в игровую площадку TypeScript, TypeScript жалуется, что он wasCalled отсутствует, но в книге говорится, что этого не должно быть:

Обратите внимание, что TypeScript достаточно умен, чтобы понять, что, хотя мы не присваивали wasCalled warnUser ему значение при объявлении warnUser функции, мы назначили wasCalled его сразу после.

Что происходит?

Комментарии:

1. Игровая площадка TypeScript использует последнюю версию TypeScript; ваша книга, скорее всего, нет. Может быть частью этого.

2. Используйте function синтаксис, и вы получите полную поддержку от языка

Ответ №1:

Просто замените let warnUser на const warnUser , чтобы Typescript знал, что функция никогда не будет переопределена в другом месте.

 type WarnUser = {
  (warning: string): void
  wasCalled: boolean
}

const warnUser: WarnUser = (warning: string) => {
  if (warnUser.wasCalled) {
    return
  }
  warnUser.wasCalled = true
  alert(warning)
}
warnUser.wasCalled = false
 

Комментарии:

1. Достаточно справедливо, но если вы function , вам не нужен интерфейс. TypeScript позволит вам добавлять свойства к функциям, объявленным таким образом.