TypeScript 5.5 新特性:这些改进让我删掉了 300 行工具类型
TypeScript 5.5 不是一个大版本,但几个小改进直接让我删掉了项目里几百行的工具类型代码。
1. 推断类型谓词(Inferred Type Predicates)
这是 5.5 最实用的特性。以前 filter 后类型收窄必须手动写类型守卫:
TYPESCRIPT
// 5.4 及之前 - 必须手动写类型守卫
const nums = [1, 2, null, 4, undefined, 6]
const validNums = nums.filter(n => n !== null && n !== undefined)
// validNums 类型仍然是 (number | null | undefined)[]
// 必须这样
const validNums = nums.filter((n): n is number => n !== null && n !== undefined)
// 5.5 - 自动推断!
const validNums = nums.filter(n => n !== null && n !== undefined)
// validNums 类型自动推断为 number[]数组方法的自动推断:
TYPESCRIPT
const items = ['a', undefined, 'b', null, 'c']
// filter 自动推断
const defined = items.filter(item => item !== undefined)
// 类型: string[]
// map 后 filter
const results = [1, 2, 3]
.map(n => n > 2 ? n : undefined)
.filter(n => n !== undefined)
// 5.5 自动推断为 number[]2. 正则表达式语法检查
TYPESCRIPT
// 5.5 会在编译时提示正则语法错误
const regex = /(unclosed group/ // ❌ 编译错误
const regex2 = /[a-z/ // ❌ 编译错误3. 隔离声明(Isolated Declarations)
新选项 isolatedDeclarations 让类型声明可以独立生成:
JSON
// tsconfig.json
{
"compilerOptions": {
"isolatedDeclarations": true
}
}TYPESCRIPT
// 启用后,所有导出必须有显式类型注解
export function add(a: number, b: number): number {
return a + b
}
// 这样不行 - 返回类型未标注
export function add(a: number, b: number) {
return a + b
}好处:可以并行生成 .d.ts 文件,大项目的构建速度提升显著。
4. JSDoc 类型导入
TYPESCRIPT
/** @import { User } from './types' */
/** @param {User} user */
export function greet(user) {
return `Hello, ${user.name}`
}5. 配置文件优化
JSON
// tsconfig.json - 5.5 新增选项
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true, // 数组索引访问加 undefined
"exactOptionalPropertyTypes": true, // 可选属性不能显式赋 undefined
"noPropertyAccessFromIndexSignature": true // 禁止 obj['key'] 当有 obj.key 时
}
}我删掉的工具类型
TYPESCRIPT
// 这些是我以前项目中常用的工具类型,5.5 后不需要了
// 1. NonNullable 数组过滤 - 现在自动推断
type NonNullableArray<T> = T extends (infer U)[]
? NonNullable<U>[]
: never
// 2. 类型谓词辅助 - filter 自动推断后不需要
function isDefined<T>(value: T | null | undefined): value is T {
return value !== null && value !== undefined
}
// 3. 对象过滤 - 现在可以这样写
const obj = { a: 1, b: null, c: 3 }
const cleaned = Object.fromEntries(
Object.entries(obj).filter(([, v]) => v !== null)
)
// 5.5 类型推断更准确升级建议
BASH
npm install typescript@latest --save-dev5.5 是向后兼容的,基本不会破坏现有代码。但建议开启 isolatedDeclarations 前先检查导出是否都有类型注解。
总结:TypeScript 5.5 的改进不大但很精准,特别是推断类型谓词,让日常开发少写很多样板代码。
读者评论 5