Когда мы должны его использовать?
Привет, меня зовут Пандху, я инженер-программист. Добро пожаловать в мой блог. Сегодня мы узнаем об константном утверждении.
Давайте углубимся в это.
const newArray = [1,2,3,4,5] as const const newString = 'hello' as const const newNumber = 1 as const
Вы можете предположить, что эти переменные неизменяемы. Это означает, что вы не можете изменить их в следующих строках. Некоторые из ваших мыслей верны, но могут быть неполными. Почему? Позвольте мне рассказать вам об этом.
Что такое «как константа»?
Это называется const assertion. Утверждение Const было выпущено в TypeScript v3.4 и выше. Согласно официальному сайту,
В TypeScript 3.4 представлена новая конструкция для литеральных значений, называемая
const
утверждениями. Его синтаксис представляет собой утверждение типа сconst
вместо имени типа (например,123 as const
). Когда мы создаем новые литеральные выражения сconst
утверждениями, мы можем сигнализировать языку, что
никакие литеральные типы в этом выражении не должны расширяться (например, нельзя переходить от
"hello"
кstring
)
литералы объектов получают
readonly
свойств
литералы массива становятся
readonly
кортежами
Честно говоря, я был сбит с толку тем, что именно было объяснено в документации, но я попытался найти другие ссылки, чтобы понять это. И после того, как я получил много ссылок, я попытался переписать код в соответствии со своим пониманием. Так вот оно.
Нет расширения типа для литеральных типов
let a = 'some words'
Если вы видите мой снимок экрана выше, я получаю объяснение, что a — строковый тип. Что, если мы отредактируем его как const?
const a = 'some words'
А что, если мы переназначим их обоих?
1. // let let a = 'some words' a = 'new word' // OK 2. // let with const assertions let a = 'some words' as const a = 'new word' // let a: "some words" - Type '"new word"' is not assignable to type '"some words"'. 3. // const (directly) const a = 'some words' a = 'new word' // const a: any - Cannot assign to 'a' because it is a constant.
Если вы видите там, когда мы переназначаем значение с помощью let, a будет ОК. С другой стороны, если мы переназначим с let внутри const assertions, a не примет и получит ошибку. Также, когда вы переназначаете с const напрямую (не с утверждениями const). Но вам нужны более конкретные объяснения для случаев 2 и 3.
В случае 2 мы получили let a: «несколько слов». В случае 3 const a: any. Почему мы получаем другую ошибку?
Потому что, когда мы используем const assertion, значение было только одним входом. Простой. Например,
let a = "some words" // will be have "string"
Но если вы используете утверждения const,
let a = "some words" as const // to the point, will explain that a just value "some words"
В приведенном выше случае a просто имеет одно значение и является конкретным абсолютно, «некоторые слова», а не какие-либо. Вы не можете переназначить другое значение, и оно доступно только для чтения.
Литералы объектов получают свойства только для чтения
Но что, если мы используем его для литералов объектов? Это работает? Давай попробуем.
Когда мы используем let или const в литералах объекта, мы по-прежнему сможем изменить значение в нем. Например,
1. // With let let data = { firstName: 'Pandhu', lastName: 'Wibowo' } data.firstName = 'Wibowo' console.log(data) // { "firstName": "Wibowo", "lastName": "Wibowo" } 2. // With const const data = { firstName: 'Pandhu', lastName: 'Wibowo' } data.firstName = 'Wibowo' console.log(data) // { "firstName": "Wibowo", "lastName": "Wibowo" }
Вы по-прежнему сможете изменить его, и это работает. Потому что он не доступен только для чтения и просто сообщает нам, есть ли у данных два свойства со строковым типом для каждого свойства.
const data: { firstName: string; lastName: string; }
Таким образом, мы можем добавить «как константу» аналогичным образом, когда используем литеральные типы.
const data = { firstName: 'Pandhu', lastName: 'Wibowo' } as const data.firstName = 'Wibowo' console.log(data) // Cannot assign to 'firstName' because it is a read-only property.
Литералы массива становятся read-only
кортежами
Мы также можем использовать его для литералов массива.
const payload = { fullName: 'Pandhu Wibowo', characteristics: ["man", 25, "husband"] } // Description for the object const payload: { fullName: string; characteristics: (string | number)[]; }
Мы хотим изменить его, чтобы он стал таким:
const payload = { fullName: 'Pandhu Wibowo', characteristics: ["man", 25, "husband"] } as const // Description for the object const payload: { readonly fullName: "Pandhu Wibowo"; readonly characteristics: readonly ["man", 25, "husband"]; }
Если мы изменим, мы получим ошибку, и сообщение будет выглядеть так:
const payload = { fullName: 'Pandhu Wibowo', characteristics: ["man", 25, "husband"] } as const payload.characteristics.push('rich') Property 'push' does not exist on type 'readonly ["man", 25, "husband"]'.
Тревога!
Если вы, ребята, оказались из Индонезии и хотите поддержать меня, чтобы я писал больше и больше, надеюсь, вы можете немного пожертвовать из своего кошелька. Вы можете поделиться своим подарком в некоторых отношениях, спасибо.
Саверия
https://saweria.co/pandhuwibowo
Трактеер
https://trakteer.id/goodpeopletogivemoney
Читать больше моих статей
Ссылка
Использование константных утверждений TypeScript для развлечения и получения прибыли | Instil
Начиная с TypeScript 3.4, мы можем использовать нотацию as const для создания «константных утверждений для наших литералов…instil.co»
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.