Выберите типы значений, которые функция принимает и возвращает, и укажите их в объявлении. На примере разберите вывод типа, объединение и тип функции.
Установите Топаз по инструкции Первая программа. Если функции и локальные значения вам незнакомы, начните с урока Значения и функции.
Проверьте и запустите функцию
Сохраните этот код в файле types.tpz в рабочей папке.
type Стадия = "draft" | "ready"
function описать(стадия: Стадия, проверки: int) -> string {
"{стадия} after {проверки} checks"
}
let проверки = 3
let текущая: Стадия = "ready"
let показать: (Стадия, int) -> string = описать
print(показать(текущая, проверки))В той же папке проверьте файл и запустите его.
topaz check types.tpz
topaz run types.tpzПроверка завершается с кодом 0. Программа выводит следующую строку.
ready after 3 checksПрочитайте типы параметров и результата
Функция описать принимает Стадия и int, а возвращает string. Тип функции (Стадия, int) -> string описывает те же параметры и результат. Он позволяет сохранить функцию в показать и вызвать её позже.
Топаз определяет тип int для проверки по начальному значению 3. Это вывод типа. Запись текущая: Стадия задаёт тип явно и называется аннотацией типа.
Имя Стадия обозначает объединение "draft" | "ready". Объединение допускает значение из любого перечисленного варианта. Здесь варианты заданы двумя строковыми литералами, поэтому другая строка, например "waiting", вызывает ошибку проверки типов. Чтобы исправить её, в файле types.tpz присвойте текущая значение "draft" или "ready".
Псевдоним type даёт существующему типу другое имя. Стадия и "draft" | "ready" обозначают один тип. Псевдоним не оборачивает значение в новую структуру.
Выберите тип по задаче
| Что нужно | Что использовать |
|---|---|
| Локальное значение с понятным начальным типом | Вывод типа, как в let проверки = 3 |
| Явные типы параметров и результата | Аннотации типов |
| Один из нескольких типов или литералов | Объединение |
| Функция для хранения или передачи как значения | Тип функции, например (int) -> bool |
| Разные типы даже при одинаковых полях или хранимых значениях | Номинальные типы record, enum, newtype |
Номинальные типы различаются по объявлениям. Например, два отдельно объявленных типа записей различны даже при одинаковых полях. Создание значений и сопоставление с образцом описаны в разделе Записи и номинальные данные.
Базовые типы записываются строчными буквами int, float, bool, string. Единичный тип записывается как (), и его значение тоже (). Имя unit не является псевдонимом типа.
Коллекции используют Array<T>, Map<K, V> и Set<T>, где буквы обозначают типы. Например, Array<string> хранит строки. Используйте Option<T> для ожидаемого отсутствия значения и Result<T, E> для успеха или восстанавливаемой ошибки.
Укажите тип пустого значения
В пустом массиве нет элементов, по которым можно вывести тип. Для None тоже нужен тип возможного значения. Следующие объявления задают эти типы явно.
let имена: Array<string> = []
let выбранное: Option<int> = NoneПервое объявление создаёт пустой массив строк. Второе создаёт Option<int> без значения. Нужный тип также могут задавать параметры функции, объявленный результат и окружающие выражения. Если тип остаётся неизвестным, проверяющий отклоняет значение.
Укажите точные аргументы типа
При записи типа указывайте столько аргументов типа, сколько требует объявление. Array<string> принимает один, а Map<string, int> принимает два. Базовые типы и параметры типа не принимают аргументов. То же правило действует для псевдонимов и пользовательских объявлений.
Обобщённые типы инвариантны. Расширение аргумента типа не делает типы коллекций взаимозаменяемыми. Например, Array<int> не является Array<int | string>.
Типы стандартной библиотеки template, JSONValue, File, Bytes, ByteBuffer, Path, Regex, Match, TOMLValue, URL, Date, BigInt, Decimal и RoundingMode не принимают аргументов типа. File обозначает тип ресурса, возвращаемого функцией open. Программа использует его операции без доступа к внутреннему представлению.
Другие правила типов
- Между
intиfloatнет неявного преобразования. - Объявляйте ограничения протоколов у параметров типа именованных функций. Раздел Функции и обобщения объясняет, как ограничения разрешают операции в теле функции.
- Рекурсивные псевдонимы, аннотации вариантности, полиморфизм высших рангов и общая рефлексия не поддерживаются.
Перейдите к разделу Функции и обобщения, чтобы использовать эти типы в функциях. Для выбора способа представления отсутствующих значений и ошибок откройте Null, Option, Result и ошибки.