Тип меняется в TypeScript - PullRequest
       73

Тип меняется в TypeScript

2 голосов
/ 19 января 2020

Кто-нибудь может объяснить, как это происходит и почему? Это ошибка или я что-то пропустил?

function isString<T>(arg:T):boolean {
     return (typeof(arg)==='string')?true:false;
}

let myEcho;
myEcho = isString;
let myInt :number = 5;
console.log(myInt  + ", Type is "+ typeof(myInt)) // 5, Type is number
myInt = myEcho("hi");
console.log(myInt  + ", Type is "+ typeof(myInt)) //  true, Type is boolean

Я определил myInt как число, но оно изменилось на булево !!!

1 Ответ

3 голосов
/ 19 января 2020

Я пинговал Тициан Черникова-Драгомир в Твиттере об этом, потому что вы говорили, что определенно не было ошибки, но я не мог себе представить настройку, которая могла бы повлиять на это. Есть один!

Вы, кажется, отключили noImplicitAny. Когда это отключено, TypeScript не так старается уточнить типы переменных, которые неявно имеют тип any, например ваш myEcho. Поэтому TypeScript не знает, что возвращает myEcho("hi"), и позволяет не сообщать о присвоении вашей переменной myInt go. Вот пример на игровой площадке TypeScript с отключенным noImplicitAny.

При включенном noImplicitAny (лучшая практика) этот код выдает ошибку компилятора TypeScript в операторе myInt = myEcho("hi"); :

Тип «логический» не может быть назначен типу «число».

Оперативное копирование, показывающее здесь ошибку

Но даже при возникновении ошибки поведение компилятора TypeScript по умолчанию все равно будет выводить JavaScript (если может, и может в этом случае). Таким образом, в runtime вы видите описанное вами поведение, потому что myInt содержит boolean (из myEcho), а не number, и вы используете JavaScript ' Оператор времени выполнения typeof.

Отслеживать ошибки компилятора TypeScript. Вот где вы найдете ошибки типа, подобные этой.

Вы также можете указать TypeScript , а не выводить JavaScript, когда есть ошибка, используя опцию компилятора --noEmitOnError .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...