Оборачивание выполняется на этапе компиляции, дополнительных объектов во время выполнения не создаётся (нулевая нагрузка). Используется для присвоения новому набору статических интерфейсов существующим типам и ограничения доступных методов.
Отличие от обычных Extension: стандартные расширения добавляют методы всем экземплярам исходного типа; Extension Type действует только тогда, когда статический тип совпадает с данным типом расширения.
// int — представляемый тип, id — имя базового исходного значения
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}Code language: Dart (dart)
Автоматически генерируемые элементы:
- Неявный конструктор
IdNumber(int id) - Геттер:
int get id
Два основных режима (наиболее распространённые)
1) Непрозрачный режим
Изоляция интерфейса|Рекомендуется для бизнес-ограничений
Не указывать ключевое слово implements
Скрывает методы базового типа для соблюдения ограничений интерфейса
Прямое присваивание между расширённым и базовым типом запрещено
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}
void main() {
final id = IdNumber(100);
id + 5; // Ошибка компиляции: оператор + отсутствует, сложение int скрыто
final int raw = id; // Ошибка, прямое присваивание запрещено
final int raw = id as int; // Явное приведение типа для получения исходного значения
}Code language: PHP (php)
2) Прозрачный режим
implements представляемый-тип
Автоматически наследует все члены базового типа, разрешено только добавление или переопределение методов
extension type Num(int v) implements int {
Num square() => Num(v * v);
}
void main() {
final n = Num(5);
print(n.isNegative); // Нативные методы int доступны напрямую
}Code language: Dart (dart)
Способы использования конструкторов
Параметр в скобках — стандартный конструктор, его можно сделать закрытым и скрыть через ._
extension type Id._(int _raw) {
// Внешний код может использовать только этот именованный конструктор, прямой вызов Id(xxx) запрещён
Id.create(int value) : _raw = value;
}Code language: JavaScript (javascript)
Поддерживаются: методы, геттеры, сеттеры, операторы
Запрещены: переменные экземпляра, абстрактные члены
Extension Types