Skip to content

参考:TypeScript 速查与对照表

基于 TypeScript 6.0 · 核于 2026-07

速查

  • 定位:JS 超集 + 静态类型 + 编译期检查;类型运行时擦除。当前稳定版 6.0latest 6.0.3),7.0 为 Go 原生重写。
  • 结构化类型:按形状兼容;对象字面量有多余属性检查(freshness)。
  • 特殊类型any(放行)/unknown(安全顶层,先收窄)/never(空集底类型)/void(无返回)。
  • 组合类型:联合 A | B / 交叉 A & B / 字面量 'a' | 1 / 元组 [string, number]
  • 类型运算符keyof / 类型位置 typeof / 索引访问 T[K] / 条件 T extends U ? X : Y / infer / 映射 { [K in keyof T]: ... } / 模板字面量。
  • 窄化typeof(⚠️nullobject)/真值/相等/in/instanceof/类型谓词 x is T/断言函数 asserts x is T/可辨识联合 + never 穷尽。
  • interface 独有声明合并;type 独有联合/元组/条件/映射命名。
  • as const 收窄为只读字面量;satisfies(4.9) 校验且保留精确推断。
  • strict 家族noImplicitAny/strictNullChecks/strictFunctionTypes 等;新项目全开。
  • 枚举取舍enum > 慎用 const enumisolatedModules 冲突) > 优先 as const 对象。

一、类型速查

类别写法说明
原始string number boolean bigint symbol一律小写
空值null undefined voidvoid = 无返回值
顶/底unknown any neverunknown 安全、never 空集
对象{ x: number; y?: string }? 可选、readonly 只读
数组number[] / Array<number>两者等价
元组[string, number]定长、逐位置定类型
联合A | B「或」,用前需收窄
交叉A & B「与」,合并对象
字面量'left' | 'right'200 | 404精确取值
函数(a: number) => string箭头写法

二、类型运算符速查

运算符示例结果/用途
keyofkeyof {a;b}"a" | "b"(键联合)
typeof(类型位)typeof config取值的静态类型
索引访问User["name"]属性类型
值联合T[keyof T]所有值类型的联合
数组元素T[number]数组/元组元素类型
条件T extends U ? X : Y类型级三元
inferT extends Array<infer E> ? E : T捕获内部类型
映射{ [K in keyof T]: T[K] }遍历键造类型
修饰符-readonly -?增删只读/可选
键重映射`[K in keyof T as `...`]`改键名/过滤
模板字面量`/${Lang}/${Kind}`类型级字符串

三、内置工具类型清单

工具类型参数作用
Partial<T>1全部属性变可选
Required<T>1全部属性变必填
Readonly<T>1全部属性变只读
Record<K, V>2构造键 K 值 V 的对象
Pick<T, K>2保留键 K(白名单)
Omit<T, K>2排除键 K(黑名单)
Exclude<U, M>2联合中剔除可赋给 M 的成员
Extract<U, M>2联合中提取可赋给 M 的成员
NonNullable<T>1null / undefined
Parameters<T>1函数参数元组
ConstructorParameters<T>1构造参数元组
ReturnType<T>1函数返回类型
InstanceType<T>1构造函数实例类型
Awaited<T>1递归解包 Promise
NoInfer<T>1阻断该处类型推断
Uppercase/Lowercase1字符串字面量大小写
Capitalize/Uncapitalize1首字母大小写

四、窄化守卫速查

守卫示例备注
typeoftypeof x === "number"⚠️ typeof null === "object"
真值if (x)排除 0/""/0n/NaN/null/undefined
相等x != null一次排除 null + undefined
in"swim" in animal按属性存在收窄
instanceofx instanceof Date按原型链收窄
类型谓词p is Fish自定义可复用守卫
断言函数asserts x is string通过后此后收窄
可辨识联合switch (s.kind)字面量判别属性
穷尽const _c: never = s漏分支编译报错

五、interface vs type

维度interfacetype
对象形状
声明合并❌ 同名报错
扩展extends交叉 &
联合
元组/原始别名
条件/映射/模板类型

经验:对象公开形状、需 extends/合并 → interface;联合/元组/条件/映射 → type

六、tsconfig 关键项对照

选项常用值说明
stricttrue严格家族总闸,新项目必开
targetes2022 / esnext产物语法级别
lib["es2023","dom"]内置 API 类型
moduleesnext / nodenext / node20产物模块格式
moduleResolutionbundler / nodenext解析策略(打包器 → bundler
paths{"@/*":["src/*"]}别名,运行时需配套
esModuleInteroptrue(6.0 恒开)CJS 默认导入互操作
noUncheckedIndexedAccesstrue(推荐)索引访问带 undefined
verbatimModuleSyntaxtrue(推荐)精确控制 import 擦除

七、枚举取舍对照

方案运行时对象反向映射主要坑建议
enum(数字)运行时体积需要运行时枚举对象时用
enum(字符串)调试友好,可用
const enum无(内联)isolatedModules 冲突、跨包版本坑谨慎/禁用
as const 对象有(普通对象)手写优先推荐

八、常见错误对照

现象根因解法
对象可能为 null开了 strictNullChecks先判空/可选链,别乱用 !
多余属性报错对象字面量 freshness检查拼写,或先赋给变量
Type 'string' is not assignable to '"GET"'字面量被拓宽as const / satisfies
联合类型属性访问报错未收窄typeof/in/可辨识联合
Cannot find module '@/x'paths 只改类型配打包器别名/tsconfig-paths
const enum 转译报错isolatedModules 冲突改普通 enumas const 对象
装饰器不生效未开对应模式旧版开 experimentalDecorators
运行时类型没校验类型被擦除用 Zod/Valibot 做运行时校验

九、版本要点(6.0 / 7.0)

  • 6.0(当前稳定,latest 6.0.3):过渡版。默认 strict:true / module:esnext / target 当年 ES / types:[];弃用 es5amd/umd/systemmoduleResolution node10/classicoutFilebaseUrlesModuleInterop 等恒开;"ignoreDeprecations":"6.0" 可缓冲。
  • 7.0:Go 原生重写(tsgo / Project Corsa),并行类型检查、数量级提速;移除 6.0 中弃用的选项。
  • 里程碑回顾as const(3.4)、可选链/空值合并(3.7)、模板字面量类型(4.1)、键重映射(4.1)、satisfies(4.9)、标准装饰器/const 类型参数(5.0)、using/显式资源管理(5.2)、--module node20/import defer(5.9)。

十、权威链接