У меня есть очень простой пример, когда TypeScript (3.5.1) в порядке с кодом, но он сразу выдает ошибку при запуске.

Я считаю, что проблема в том, что по сути value объявлен , но не инициализирован до запуска getValue. Это довольно не интуитивно понятно, но я понимаю, что так работает JS.

Однако, почему TS не может обнаружить эту проблему в таком простом примере? Поскольку value является константой, мне кажется, что TS должен быть в состоянии точно определить, когда он установлен, и предсказать, что этот код завершится сбоем.

console.log(getValue());

const value = "some string";

function getValue() {
  return value;
}

Во втором примере без вызова функции TS обнаруживает, что переменная используется перед присваиванием:

console.log(value);
const value = "some string";

TSLint «не использовать перед объявлением» также не применяется.

Предполагая, что TS / linting не сможет уловить это, есть ли лучшая практика, чтобы применить в первоначальном примере, чтобы избежать этого сбоя? «Всегда объявляйте константы уровня модуля в начале файла», например.

9
Freewalker 30 Май 2019 в 00:34

2 ответа

Лучший ответ

Вы можете включить only-arrow-functions tslint, а затем заменить свой function getValue() с

const getValue = function(): string {
  return value;
}

Или даже

const getValue = (): string => value;

На этом этапе ваша первая строка будет ошибкой компилятора:

Block-scoped variable 'getValue' used before its declaration
3
danielnixon 30 Май 2019 в 07:31

Я думаю, что ответ функции стрелки, приведенный выше, отвечает на ваш вопрос наилучшим образом, но так же, как sidenote: выбор строгого рабочего процесса также предотвратит ошибки подъема: объявляйте переменные, объявляйте функции, вызывайте функцию init:

const value = "some string"

function startApp() { 
    console.log(getValue());
}

function getValue() {
    console.log("yo " + value)
    return value;
}

startApp()
0
Kokodoko 30 Май 2019 в 08:19