Я считал, что " strVariable as number" преобразует strVariable в числовой тип.
Но после нескольких часов борьбы я обнаружил, что его тип не меняется.
Число ( strVariable ) было ключевым.

В чем разница между 'as number' и 'Number ()'?
И если «как число» на самом деле не преобразует тип в число, почему ошибка типа IDE удаляется?

const strVariable: string = '';
const numVariable: number = 0;
numVariable = strVariable as unknown as number; // I thought it is converting to number but it wasn't
typeof (strVariable as unknown as number); // string. but type error is gone. How?
typeof (Number(strVariable)) // it do converts to number.
1
Flippingflop 27 Ноя 2021 в 16:13

2 ответа

Лучший ответ

Итак, чтобы понять, что нам сначала нужно уточнить, что система типов, которую дает нам TypeScript, не существует во время выполнения. Вы можете смотреть на это так, как будто у вас есть 2 совершенно разных уровня типов для переменных, один из которых является типом, который вы ожидаете от него, - своего рода виртуальным типом (тип TypeScript), а другой - типом, на котором он на самом деле находится. время выполнения (тип JavaScript).

Ключевое слово typeof дает вам тип среды выполнения переменной, а ключевое слово as изменяет тип TypeScript переменной.

Теперь, когда мы это понимаем, мы можем взглянуть на вашу конкретную ситуацию. Вы используете ключевое слово as, которое принадлежит TypeScript и выполняет «виртуальное» приведение. При его использовании вы сообщаете компилятору машинописного текста, что ожидаете, что переменная будет числом, хотя на самом деле это может быть не число. При использовании ключевого слова typeof вы получаете тип времени выполнения переменной, и поскольку вы использовали только ключевое слово as и не преобразовывали его, оно осталось прежним.

В другом примере, где вы использовали функцию Number(), вы фактически преобразовали переменную во время выполнения JavaScript, что означает, что фактический тип переменной изменился на число, что означает, что когда вы проверяете тип с помощью typeof вы получите number в качестве типа переменной.

Надеюсь, это было достаточно ясно, если нет, возможно, эта статья о приведении типов в TypeScript поможет прояснить ситуацию: https://dev.to/ylerjen/typescript-cast- is-a-type-breaker-1jbh

2
Dori Lahav Waisberg 27 Ноя 2021 в 16:38

as ключевое слово просто "сообщить компилятору, что это число". Он НЕ преобразовывает ничего, значение ДОЛЖНО быть числом alredy, иначе вы столкнетесь с необычным поведением.

Number () - это функция с точным поведением, которое может преобразовывать одинаковые значения в числа.

Es :

const n: any = 5;
const s: string = "5";

const a = n as number // <- ok... the type of a was "any", but the content is alredy a number.
const b = s as number // <- error
const c = Number(n) // <- ok!
const d = Number(s) // <- ok, Number() can convert a string onto a number
2
Massimo Rebuglio 27 Ноя 2021 в 16:31