TypeScript 内置数据类型完整清单(附:类型对照表与示例)

TypeScript 的内置数据类型可以分成三大类:string、number、boolean、symbol、bigint、null、undefined 七个原始类型,any、unknown、void、never 四个特殊类型,再加上数组、元组、枚举、对象这些对象类类型,合计十余个关键字。其中原始类型与特殊类型由语言内置,数组与元组靠组合语法构造,enum 则是 TS 在 JS 之外补充的类型。做表单校验模块时把入参从 any 逐个换成字面量联合类型之后,非法分支在编译期就被拦住,这类收益正是建立在对每个类型边界的准确理解上。

原始类型:七个构建一切的原子

原始类型是最小颗粒度的值类型,对应 JavaScript 里 typeof 能返回的那几类基础值。每个的用途与写法如下:

  1. string 文本类型:任意字符串,支持单引号、双引号与反引号模板串,let name: string = '订单A' 是最典型的声明;
  2. number 数值类型:整数与浮点数共用一个类型,TS 没有 int 与 float 之分,二进制、八进制、十六进制字面量都归它管;
  3. boolean 布尔类型:只有 true 与 false 两个值,常用于开关与校验结果;
  4. symbol 唯一标识类型:通过 Symbol() 创建的唯一且不可变值,多用于对象的特殊键;
  5. bigint 大整数类型:以 n 结尾的字面量(如 100n),表示超出 number 安全范围的超长整数;
  6. null 空值类型:表示「此处故意没有值」,只有 null 一个值;
  7. undefined 未定义类型:表示「变量还没有被赋值」,只有 undefined 一个值。

两个容易踩的细节:其一,类型名必须小写,String、Number、Boolean 首字母大写形式指向的是包装对象类型,日常代码几乎不该出现,官方手册明确建议始终用小写;其二,null 与 undefined 在默认配置下是所有类型的子类型,任何变量都能被赋成这两个值,开启 strictNullChecks 之后它们才独立成强制处理的类型,新项目建议直接开严格模式。

特殊类型:any、unknown、void、never 各管一段

特殊类型不对应某个具体值,而是表达「类型不确定」「没有值」「永不到达」这类语义。四个类型的分工先列出来:

  1. any 任意类型:放弃类型检查,允许一切操作,适合迁移期的临时过渡;
  2. unknown 未知类型:同样能接收任意值,但使用前必须收窄,是 any 的安全替代品;
  3. void 无返回值类型:标记函数没有返回值,只应出现在函数返回位上;
  4. never 永不类型:表示永远不会有值,用于抛错的函数、死循环、或者穷尽检查的兜底分支。

any 与 unknown 的关系最值得展开。接口返回的第三方数据标成 any 之后,后续每一行代码都失去了保护;标成 unknown 则强制先判断类型才能使用。两张表把区别说透,先看四个特殊类型的整体对照:

类型 能否接收任意值 能否直接使用 典型位置 使用建议
any 能 能,无任何检查 迁移期老代码 尽量少用
unknown 能 不能,须先收窄 外部输入、JSON 解析结果 优先选它
void 不能 不适用 函数返回值 保持默认即可
never 不能 不适用 抛错、死循环、穷尽分支 配合联合类型做校验

再看 any 与 unknown 在编译行为上的差异,这是代码评审的高频议题:

行为 any unknown
赋值给 string 等具体类型 允许 报错,需先收窄
直接调用属性和方法 允许 报错
传递给任意函数 允许 报错
类型安全 完全丧失 保留检查能力

noImplicitAny 配置项会把「推断不出类型就默认 any」的行为标为错误,这个开关是识别隐形 any 的主要手段,存量代码里大量隐患就藏在没有标注的参数里。

对象类类型:数组、元组、枚举、对象

对象类类型可以装多个值或组合其他类型,是日常业务代码的主力。常见的四个:

  1. 数组(Array):同一类型元素的列表,两种写法 number[] 与 Array<number> 等价,推荐前者;
  2. 元组(Tuple):长度与每位类型都固定的数组,[string, number] 表示第一位必须是字符串、第二位必须是数字;
  3. 枚举(enum):给一组常量起友好名字,数字枚举默认从 0 自增,字符串枚举需显式赋值,常量场景也可以用 const enum 或联合字面量替代;
  4. 对象(object):键值对集合,更常见的写法是用 interface 或 type 定义形状后引用。

三类内置类型放在一起对照,选型时不容易混:

分类 成员 值数量 是否需要额外语法
原始类型 string、number、boolean 等 7 个 单值 关键字直用
特殊类型 any、unknown、void、never 无值或任意值 关键字直用
对象类类型 数组、元组、枚举、对象 多值组合 []、泛型、enum、interface

枚举要补充一句:它是 TS 编译后仍会保留运行时对象的少数类型之一,追求零运行时开销时,用 as const 对象或字符串字面量联合类型(如 'pending' | 'done')同样能达到目的,体积更小。

一段代码串起常用类型

下面这段代码把原始类型、特殊类型与对象类类型放进同一个可运行的文件,注释标出每个类型的位置:

// 原始类型
let productName: string = '无线鼠标';
let price: number = 129.5;
let inStock: boolean = true;
let sku: symbol = Symbol('sku-001');
let bigId: bigint = 9007199254740993n;

// 对象类类型
let tags: string[] = ['外设', '无线'];
let spec: [string, number] = ['电池mAh', 500];
enum Status { Draft = 1, Published, Archived }

// 特殊类型
function publish(id: number): void {
  console.log('发布商品', id);
}
function fail(msg: string): never {
  throw new Error(msg);
}

// unknown:接收外部数据,先收窄再使用
function parseRaw(raw: unknown): string {
  if (typeof raw === 'string') {
    return raw.trim();
  }
  return fail('非法输入');
}

parseRaw 里的 typeof 判断就是类型收窄:unknown 经过收窄后,TS 才允许把它当 string 使用。这个模式可以固化成四步流程:

  1. 外部输入(接口返回、JSON.parse 结果)统一标为 unknown;
  2. 用 typeof、instanceof 或自定义类型守卫收窄到具体类型;
  3. 收窄失败走异常或默认值分支,返回值标 never 或兜底类型;
  4. 内部变量尽量交给类型推断,只在边界处写标注。

常见问题(FAQ)

Q1:any 和 unknown 在实际开发中怎么选?

外部输入与不确定结构的数据一律用 unknown,配合类型守卫收窄;any 只留给迁移期来不及补类型的老代码。

Q2:为什么建议用小写的 string 而不是 String?

小写指原始类型,大写指包装对象类型,后者绕开了常规检查,官方手册建议类型标注始终使用小写形式。

Q3:TypeScript 常用内置类型一共有多少个?

原始类型 7 个、特殊类型 4 个,加上数组、元组、枚举、对象等组合类型,日常开发约十几个,够覆盖绝大多数场景。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 qiqicto@qq.com 举报,一经查实,本站将立刻删除。
赞 (0)
小码农的头像小码农认证作者

相关推荐

返回顶部