У меня есть очень простой пример, когда 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 не сможет уловить это, есть ли лучшая практика, чтобы применить в первоначальном примере, чтобы избежать этого сбоя? «Всегда объявляйте константы уровня модуля в начале файла», например.
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
Я думаю, что ответ функции стрелки, приведенный выше, отвечает на ваш вопрос наилучшим образом, но так же, как sidenote: выбор строгого рабочего процесса также предотвратит ошибки подъема: объявляйте переменные, объявляйте функции, вызывайте функцию init:
const value = "some string"
function startApp() {
console.log(getValue());
}
function getValue() {
console.log("yo " + value)
return value;
}
startApp()
Новые вопросы
typescript
TypeScript - это типизированный надмножество JavaScript, которое компилируется в простой JavaScript. Он добавляет в JavaScript дополнительные типы, классы, интерфейсы и модули. Этот тег предназначен для вопросов, относящихся к TypeScript. Он не используется для ответов на общие вопросы по JavaScript.