Тип extension type в Dart
Иногда одно и то же представление нужно помечать разными
именами на этапе компиляции, но не создавать отдельный
объект в памяти. В Dart 3 для этого служит конструкция
extension type: она оборачивает уже существующий
тип-представление.
Запись начинается с имени, ключевых слов extension type
и типа представления в скобках. В теле можно добавить
методы и геттеры, которые работают с этим представлением:
extension type PostId(int id) {
int get value => id;
}
void main() {
var raw = 7;
PostId pid = PostId(raw);
print(pid.value);
}
Переменная raw хранит обычное число, а
PostId(raw) создает статическую обертку с тем
же представлением. Геттер value возвращает
исходное число из параметра id:
extension type PostId(int id) {
int get value => id;
}
void report(PostId post) {
print('post ${post.value}');
}
void main() {
report(PostId(3));
}
Extension type не является классом: при выполнении
программы обертка стирается, и остается только
представление. Проверки на этапе компиляции при этом
различают PostId и голый int, поэтому
случайно передать просто число туда, где ждут
идентификатор поста, сложнее:
Объявите extension type Employee с
представлением int и геттером value,
который возвращает это число. Создайте значение из
5 и выведите value.
Дан следующий код:
extension type Employee(int id) {
int get value => id;
}
void showId(Employee person) {
print(person.value);
}
void main() {
var raw = 9;
}
Оберните raw в Employee, передайте
результат в showId и запустите программу.