Type aliases

类型别名

type-aliases.md
commit: 3c8acda52ffcf5f7ca410c76f4fddf0e129592e2
本章译文最后维护日期:2022-10-22

句法
TypeAlias :
   type IDENTIFIER GenericParams? ( : TypeParamBounds )? WhereClause? ( = Type WhereClause?)? ;

类型别名为现有的类型定义一个新名称。类型别名用关键字 type 声明。每个值都是一个唯一的特定的类型,但是可以实现几个不同的 trait,或者兼容几个不同的类型约束。

例如,下面将类型 Point 定义为类型 (u8, u8) 的同义词/别名:

#![allow(unused)]
fn main() {
type Point = (u8, u8);
let p: Point = (41, 68);
}

元组结构体或单元结构体的类型别名不能用于充当该类型的构造函数:

#![allow(unused)]
fn main() {
struct MyStruct(u32);

use MyStruct as UseAlias;
type TypeAlias = MyStruct;

let _ = UseAlias(5); // OK
let _ = TypeAlias(5); // 无法工作
}

类型别名不用作关联类型时,必须包含type规范,而不能包含TypeParamBounds规范。

类型别名用作 trait 中的关联类型时,不能包含type规范,但可以包括TypeParamBounds规范。

类型别名用作 trait impl 中的关联类型时,必须包含type规范,而不能包含TypeParamBounds规范。

trait impl 中类型别名上等号前的 Where子句(如 type TypeAlias<T> where T: Foo = Bar<T>)已被弃用。目前推荐使用等号后面的 Where子句(如type TypeAlias<T> = Bar<T> where T: Foo)。