基础类型可以开发者更准确地描述数据的结构和意图。
TypeScript 包含的数据类型如下表:
类型 | 描述 | 示例 |
---|---|---|
string |
表示文本数据 | let name: string = "Alice"; |
number |
表示数字,包括整数和浮点数 | let age: number = 30; |
boolean |
表示布尔值 true 或 false |
let isDone: boolean = true; |
array |
表示相同类型的元素数组 | let list: number[] = [1, 2, 3]; |
tuple |
表示已知类型和长度的数组 | let person: [string, number] = ["Alice", 30]; |
enum |
定义一组命名常量 | enum Color { Red, Green, Blue }; |
any |
任意类型,不进行类型检查 | let value: any = 42; |
void |
无返回值(常用于函数) | function log(): void {} |
null |
表示空值 | let empty: null = null; |
undefined |
表示未定义 | let undef: undefined = undefined; |
never |
表示不会有返回值 | function error(): never { throw new Error("error"); } |
object |
表示非原始类型 | let obj: object = { name: "Alice" }; |
union |
联合类型,表示可以是多种类型之一 | let id: string |
unknown |
不确定类型,需类型检查后再使用 | let value: unknown = "Hello"; |
注意:TypeScript 和 JavaScript 没有整数类型。
表示文本数据,只能存储字符串,通常用于描述文字信息。
1 |
let message: string = "Hello, TypeScript!"; |
模板字符串:TypeScript 支持 模板字符串,用反引号 (记住不是单引号 ')来定义,允许在字符串中插入变量或表达式,非常适合多行文本和拼接变量。
1 2 3 |
let name: string = "Alice"; let greeting: string = `Hello, ${name}! Welcome to TypeScript.`; console.log(greeting); // 输出:Hello, Alice! Welcome to TypeScript. |
TypeScript 使用 number 表示所有数字,包括整数和浮点数。
1 2 |
let age: number = 25; let temperature: number = 36.5; |
表示逻辑值 true 或 false,用于条件判断。
1 |
let isCompleted: boolean = false; |
可以表示一组相同类型的元素。可以使用 type[] 或 Array<type> 两种方式表示。
1 2 |
let numbers: number[] = [1, 2, 3]; let names: Array<string> = ["Alice", "Bob"]; |
表示已知数量和类型的数组。每个元素可以是不同的类型,适合表示固定结构的数据。
1 |
let person: [string, number] = ["Alice", 25]; |
用来定义一组命名常量。默认情况下枚举的值从 0 开始递增。
1 2 3 4 5 6 |
enum Color { Red, Green, Blue, } let favoriteColor: Color = Color.Green; |
以表示任何类型。适合不确定数据类型的情况,但使用时需谨慎,因为 any 会绕过类型检查。
1 2 |
let randomValue: any = 42; randomValue = "hello"; |
任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。
1、变量的值会动态改变时,比如来自用户的输入,任意值类型可以让这些变量跳过编译阶段的类型检查,示例代码如下:
1 2 3 |
let x: any = 1; // 数字类型 x = 'I am who I am'; // 字符串类型 x = false; // 布尔类型 |
改写现有代码时,任意值允许在编译时可选择地包含或移除类型检查,示例代码如下:
1 2 3 |
let x: any = 4; x.ifItExists(); // 正确,ifItExists方法在运行时可能存在,但这里并不会检查 x.toFixed(); // 正确 |
定义存储各种类型数据的数组时,示例代码如下:
1 2 |
let arrayList: any[] = [1, false, 'fine']; arrayList[1] = 100; |
用于没有返回值的函数。声明变量时,类型 void 意味着只能赋值 null 或 undefined。
1 2 3 |
function logMessage(message: string): void { console.log(message); } |
null 和 undefined分别表示"空值"和"未定义"。在默认情况下,它们是所有类型的子类型,但可以通过设置 strictNullChecks 严格检查。
1 2 |
let empty: null = null; let notAssigned: undefined = undefined; |
null
在 JavaScript 中 null 表示 "什么都没有"。
null是一个只有一个值的特殊类型。表示一个空对象引用。
用 typeof 检测 null 返回是 object。
undefined
在 JavaScript 中, undefined 是一个没有设置值的变量。
typeof 一个没有值的变量会返回 undefined。
Null 和 Undefined 是其他任何类型(包括 void)的子类型,可以赋值给其它类型,如数字类型,此时,赋值后的类型会变成 null 或 undefined。而在TypeScript中启用严格的空校验(--strictNullChecks)特性,就可以使得null 和 undefined 只能被赋值给 void 或本身对应的类型,示例代码如下:
1 2 3 4 5 |
// 启用 --strictNullChecks let x: number; x = 1; // 编译正确 x = undefined; // 编译错误 x = null; // 编译错误 |
上面的例子中变量 x 只能是数字类型。如果一个类型可能出现 null 或 undefined, 可以用 | 来支持多种类型,示例代码如下:
1 2 3 4 5 |
// 启用 --strictNullChecks let x: number | null | undefined; x = 1; // 编译正确 x = undefined; // 编译正确 x = null; // 编译正确 |
更多内容可以查看:JavaScript typeof, null, 和 undefined
表示不会有返回值,通常用于抛出错误或进入无限循环的函数,表示该函数永远不会正常结束。
1 2 3 |
function throwError(message: string): never { throw new Error(message); } |
never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。这意味着声明为 never 类型的变量只能被 never 类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环),示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
let x: never; let y: number; // 编译错误,数字类型不能转为 never 类型 x = 123; // 运行正确,never 类型可以赋值给 never类型 x = (()=>{ throw new Error('exception')})(); // 运行正确,never 类型可以赋值给 数字类型 y = (()=>{ throw new Error('exception')})(); // 返回值为 never 的函数可以是抛出异常的情况 function error(message: string): never { throw new Error(message); } // 返回值为 never 的函数可以是无法被执行到的终止点的情况 function loop(): never { while (true) {} } |
表示非原始类型的值,适用于复杂的对象结构。
1 |
let person: object = { name: "Alice", age: 30 }; |
表示一个变量可以是多种类型之一。通过 | 符号实现。
1 2 3 |
let id: string | number; id = "123"; id = 456; |
与 any 类似,但更严格。必须经过类型检查后才能赋值给其他类型变量。
1 2 3 4 |
let value: unknown = "Hello"; if (typeof value === "string") { let message: string = value; } |
类型断言可以让开发者明确告诉编译器变量的类型,常用于无法推断的情况。可以使用 as 或尖括号语法。
1 2 |
let someValue: any = "this is a string"; let strLength: number = (someValue as string).length; |
字面量类型可以让变量只能拥有特定的值,用于结合联合类型定义变量的特定状态。
1 2 |
let direction: "up" | "down" | "left" | "right"; direction = "up"; |
通过这些类型,TypeScript 提供了更强的类型安全性和代码检查能力,使开发者能够更清晰、准确地表达数据和意图,减少运行时错误。
以下实例展示了 TypeScript 中主要基础类型的定义和使用,模拟一个用户对象和相关的操作函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
// 定义枚举类型,用于表示用户的角色 enum Role { Admin, User, Guest, } // 使用 interface 定义用户的结构 interface User { id: number; // number 类型,用于唯一标识用户 username: string; // string 类型,表示用户名 isActive: boolean; // boolean 类型,表示用户是否激活 role: Role; // enum 类型,用于表示用户角色 hobbies: string[]; // array 类型,存储用户的兴趣爱好 contactInfo: [string, number]; // tuple 类型,包含电话号码的元组,格式为:[区域码, 电话号码] } // 创建用户对象,符合 User 接口的结构 const user: User = { id: 1, username: "Alice", isActive: true, role: Role.User, hobbies: ["Reading", "Gaming"], contactInfo: ["+1", 123456789], }; // 定义一个返回字符串的函数来获取用户信息 function getUserInfo(user: User): string { return `User ${user.username} is ${user.isActive ? "active" : "inactive"} with role ${Role[user.role]}`; } // 使用 void 类型定义一个函数,专门打印用户信息 function printUserInfo(user: User): void { console.log(getUserInfo(user)); } // 定义一个 union 类型的函数参数,接受用户 ID(number)或用户名(string) function findUser(query: number | string): User | undefined { // 使用 typeof 来判断 query 的类型 if (typeof query === "number") { // 如果是数字,则根据 ID 查找用户 return query === user.id ? user : undefined; } else if (typeof query === "string") { // 如果是字符串,则根据用户名查找用户 return query === user.username ? user : undefined; } return undefined; } // 定义一个 never 类型的函数,用于处理程序的异常情况 function throwError(message: string): never { throw new Error(message); } // 使用 any 类型处理未知类型的数据 let unknownData: any = "This is a string"; unknownData = 42; // 重新赋值为数字,类型为 any // 使用 unknown 类型处理不确定的数据,更加安全 let someData: unknown = "Possible data"; if (typeof someData === "string") { console.log(`Length of data: ${(someData as string).length}`); } // 调用各个函数并测试 printUserInfo(user); // 打印用户信息 console.log(findUser(1)); // 根据 ID 查找用户 console.log(findUser("Alice")); // 根据用户名查找用户 // 使用 null 和 undefined 类型的变量 let emptyValue: null = null; let uninitializedValue: undefined = undefined; |
说明:
Role
):用于定义用户角色的命名常量 Admin
、User
和 Guest
。User
):定义了 User
对象的结构,包括 id
、username
、isActive
等属性,展示了 string
、number
、boolean
、array
和 tuple
类型的使用。getUserInfo
:返回用户的描述信息,使用了字符串插值并结合 enum
。printUserInfo
:类型为 void
,因为它仅输出信息,不返回任何值。number | string
):用于 findUser
函数的参数,可以接受数字或字符串。never
类型:throwError
函数抛出错误,不会正常返回,因此使用 never
类型。any
类型:展示如何声明一个可以接收任何类型的变量。unknown
类型:类似 any
,但更加安全,示例中在类型断言之前进行类型检查。null
和 undefined
:演示空值的使用。
from:https://www.runoob.com/typescript/ts-type.html