编译期包装,运行时无额外对象(零开销);用来给原有类型换一套静态接口,限制可用方法。
区别普通 Extension:普通扩展给原始类型全体实例加方法;Extension Type 只在静态类型为该扩展类型时生效。
// int 是【表示类型】,id 是底层原始对象名称
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}Code language: Dart (dart)
自动生成:
- 隐式构造
IdNumber(int id) - getter:
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)
支持:方法、getter、setter、运算符
禁止:实例变量、abstract 成员
Previous: 扩展方法(Extension methods)
Next: Class Modifiers 类修饰符