TypeScript 类型别名怎么用?

文章导读
Previous Quiz Next In TypeScript 中,type aliases 是一种定义类型的方式。它允许你为类型赋予一个特定的名称,或者使用 type 关键字定义自定义类型。基本上,你可以对原始类型和非原始数据类型进行一些修改,并使用 type alia
📋 目录
  1. 语法
  2. 为 Primitive Types 创建别名
  3. 为 Union Types 创建别名
  4. 为 Tuples 创建别名
  5. 对象类型别名
  6. 函数类型别名
  7. 与泛型一起使用类型别名
A A

TypeScript - 类型别名



Previous
Quiz
Next

In TypeScript 中,type aliases 是一种定义类型的方式。它允许你为类型赋予一个特定的名称,或者使用 type 关键字定义自定义类型。基本上,你可以对原始类型和非原始数据类型进行一些修改,并使用 type aliases 定义自定义数据类型。

语法

你可以使用下面的语法在 TypeScript 中定义 type aliases。

type aliasName = Type;

在上方的代码中,type 是一个关键字。AliasName 是 type aliases 的名称。Type 可以是 primitive、非 primitive 或任何自定义数据类型。

为 Primitive Types 创建别名

type alias 的基本用法是为 primitive types 创建别名,即创建 primitive type 的副本。例如,在实时应用中,与其直接为 userID 变量使用 string 或 number 数据类型,我们可以创建 userID alias 并将类型存储其中,以提高代码的可维护性。

示例

在下面的代码中,我们定义了 number 类型的 UserID type alias。变量 user1 只能包含 number 值,因为其类型是 UserID

// 定义 type alias
type UserID = number;
// 定义 type alias 的变量
let user1: UserID = 101;
console.log(user1);

编译后,将生成以下 JavaScript 代码。

// 定义 type alias 的变量
let user1 = 101;
console.log(user1);

输出如下

101

为 Union Types 创建别名

每当你想定义一个可以包含多种类型值的变量时,就可以使用 union types。例如,如果你在开发一个接受多种类型输入(例如 string 和 number)的 function,使用 type alias 可以使 function signatures 更加简洁。否则,如果在整个代码中重复 union type,会使代码变得复杂。

示例

在下面的代码中,StringOrNumber type alias 包含 string 和 number 的 union。logMessage() function 接受 string 或 numeric 值作为参数,因为参数类型是 StringOrNumber

接下来,我们传递 string 和 number 作为参数来执行该 function。

type StringOrNumber = string | number;
function logMessage(message: StringOrNumber): void {
    console.log(message);
}
logMessage("Hello");
logMessage(123);

编译后,将生成以下 JavaScript 代码。

function logMessage(message) {
    console.log(message);
}
logMessage("Hello");
logMessage(123);

上方代码的输出如下

Hello
123

为 Tuples 创建别名

tuple alias 用于定义固定大小数组的结构,该数组可以按照特定顺序包含特定类型的数值。

示例

在下面的代码中,我们定义了 RGBColor tuple 来存储颜色的 RGB 值。在这个 tuple alias 中,所有值都是 numeric 类型。

type RGBColor = [number, number, number];
let red: RGBColor = [255, 0, 0];
console.log(`Red color: ${red}`);

编译后,将生成以下 JavaScript 代码。

let red = [255, 0, 0];
console.log(`Red color: ${red}`);

上方代码的输出如下

Red color: 255,0,0

对象类型别名

对象可以具有键值对格式的属性。有时,你需要定义多个具有相同结构的 object,可以使用对象类型别名。通过为对象类型创建别名,你可以复用它。

示例

在下面的代码中,我们定义了 'User' 类型,它包含 string 类型的 id 和 name 属性。

'user' 对象包含 string 类型的 id 和 name。

// 为 User 对象定义类型别名
type User = {
    id: string;
    name: string;
};

// 使用 User 类型别名定义 user 对象
let user: User = { id: "101", name: "Alice" };
console.log(user);

编译后,将生成以下 JavaScript 代码。

// 使用 User 类型别名定义 user 对象
let user = { id: "101", name: "Alice" };
console.log(user);

上述代码的输出如下

{ id: '101', name: 'Alice' }

函数类型别名

为函数类型创建别名在处理高阶函数或回调时特别有用,它为函数应该接受和返回什么提供了清晰的契约。

示例

在下面的代码中,'GreeterFunction' 定义了函数的类型。它接受 string 值作为参数,并返回 string 值。

'greet' 变量存储类型为 'GreeterFunction' 的函数表达式。

// 定义函数类型
type GreeterFunction = (name: string) => string;
// 定义匹配该类型的函数
const greet: GreeterFunction = name => `Hello, ${name}!`;
console.log(greet("TypeScript"));

编译后,将生成以下 JavaScript 代码。

// 定义匹配该类型的函数
const greet = name => `Hello, ${name}!`;
console.log(greet("TypeScript"));

输出如下

Hello, TypeScript!

与泛型一起使用类型别名

泛型用于创建自定义类型。它接受类型 'T' 作为参数,并基于类型 'T' 创建新类型。

示例

在下面的代码中,'Container' 类型接受类型 'T' 作为参数,并定义类型为 'T' 的对象属性值。

之后,在使用 'Container' 类型时,我们将数据类型作为参数传递。对于 'numberContainer' 变量,我们使用了 'number' 类型,对于 'stringContainer' 变量,我们使用了 'string' 数据类型。

// 定义泛型类型别名
type Container<T> = { value: T };

// 使用泛型类型别名
let numberContainer: Container<number> = { value: 123 };
let stringContainer: Container<string> = { value: "Hello World" };

console.log(numberContainer);  // 输出: { value: 123 }
console.log(stringContainer);  // 输出: { value: 'Hello World' }

编译后,将生成以下 JavaScript 代码。

// 使用泛型类型别名
let numberContainer = { value: 123 };
let stringContainer = { value: "Hello World" };
console.log(numberContainer); // 输出: { value: 123 }
console.log(stringContainer); // 输出: { value: 'Hello World' }

上述代码的输出如下

{ value: 123 }
{ value: 'Hello World' }

类型别名是定义自定义类型的方式,还允许在定义一次后复用复杂类型。它还有助于提高代码可读性并减少代码复杂度。