2014-01-24 2 views
1

Есть ли какая-либо конкретная причина, по которой компилятор TypeScript не отмечает следующий случай как ошибку?Перекрестное определение локальных переменных TypeScript

myFunction(len: number) { 
    var len: number = 5;  // re-definition of local variable (name clash) 
} 

Еще один:

myFunction() { 
    var b: number = a;  // variable a is accessed before it is declared/initialized 
    var a: number = 5; 
} 

я столкнулся оба ситуаций, по крайней мере в два раза при преобразовании Javascript для машинописи. Сэкономили бы часы отладки, если бы компилятор предупредил меня.

машинопись 0.9.5

EDIT: Вот пример некоторой недействительной машинописи, что машинопись компилятор компилирует актуальное Javascript:

class MyClass { 
    myFunction(myParam: number) { 
     myParam = 'abc'; 
    } 
} 

Если я сохранить это в Visual Studio, машинопись флаги IT в качестве погрешности, но, тем не менее, скомпилирует его на

var MyClass = (function() { 
    function MyClass() { 
    } 
    MyClass.prototype.myFunction = function (myParam) { 
     myParam = 'abc'; 
    }; 
    return MyClass; 
})(); 

Я сталкиваюсь с такими ситуациями на ежедневной ba сестренка.

EDIT 2: Запрос подан: https://typescript.codeplex.com/workitem/2128

+0

машинопись только очень легкий тип проверки поставить на вершине JavaScript. Если вы хотите более эффективную проверку синтаксиса, почему бы вам не переключиться на Dart? – SpiderPig

+2

Переключение на Дарт может быть вариантом для тех, кто действительно не любит Javascript. Мне нравится, хотя, я просто хочу легкий тип проверки, поэтому я иду с TypeScript. И я надеюсь, что этот тип checker реализует предупреждения для переопределений переменных. – cheeesus

+1

TypeScript всегда будет скомпилирован для JavaScript, если нет синтаксических проблем. Поэтому, в то время как ваш второй пример - ошибка типа, нет нарушения спецификации ECMA. – thomaux

ответ

4

Хотя запутанным, ни один из этих случаев являются ошибки в соответствии со спецификацией ECMAScript. TypeScript не является инструментом для переливания. Повторная декларация переменной, которая уже объявлена, действительна в EcmaScript (это нет-op), а объявления переменных поднимаются, поэтому вы не можете получить доступ к переменной до ее объявления.

Первый один такой же, как:

function myFunction(len: number) { 
    len = 5; 
} 

Вторая такая же, как:

function myFunction() { 
    var b: number, a: number; 
    b = a; 
    a = 5; 
} 
+1

Но не могли ли люди TypeScript просто решить, что они отмечают такую ​​ошибку, как ошибка? Компилятор все еще может скомпилировать его, но он появится в списке ошибок. Существует много случаев, когда компилятор TypeScript компилирует недопустимый TypeScript в Javascript, но отмечает его как ошибку. – cheeesus

+0

Или, по крайней мере, показать предупреждение. – cheeesus

+0

Я не могу думать о чем-либо, что TypeScript испускает ошибку, это не системная ошибка типа, за исключением случаев использования некоторых функций ES5 в режиме ES3. –

Смежные вопросы