实用主义的 TypeScript 技巧
- Authors
- Name
- 小明&小艺
TypeScript 作为一种静态类型检查的语言,不仅提高了代码的安全性,还大大增强了开发者的编程体验。本文将通过一些实用技巧和实例,帮助你更好地掌握和应用 TypeScript。
never
类型检查 switch case
语句
1. 使用 在 switch case
语句中,never
类型可以帮助我们确保所有可能的情况都被处理,避免漏掉某些情况。
type Fruit = 'apple' | 'banana' | 'orange'
function getFruitColor(fruit: Fruit): string {
switch (fruit) {
case 'apple':
return 'red'
case 'banana':
return 'yellow'
case 'orange':
return 'orange'
default:
const exhaustiveCheck: never = fruit
return exhaustiveCheck
}
}
在上面的例子中,如果我们在 Fruit
类型中添加了新的水果类型,但没有在 switch
语句中处理这个新类型,TypeScript 将会在 default
分支的 exhaustiveCheck
处报错,从而提醒我们处理新情况。
2. 使用互斥类型替代联合类型
在处理联合类型时,使用互斥类型可以让类型系统更清晰,避免意外情况。
type Square = { kind: 'square'; size: number }
type Rectangle = { kind: 'rectangle'; width: number; height: number }
type Shape = Square | Rectangle
function getShapeArea(shape: Shape): number {
if (shape.kind === 'square') {
return shape.size * shape.size
} else if (shape.kind === 'rectangle') {
return shape.width * shape.height
} else {
const exhaustiveCheck: never = shape
return exhaustiveCheck
}
}
通过使用互斥类型,我们可以确保每个类型都有唯一的 kind
属性,这样在类型检查时更容易处理。
3. 保留联合类型的提示
有时候,我们希望在编写代码时保留联合类型的提示,这样在开发过程中可以更方便地知道哪些类型是可能的。
type Status = 'success' | 'error' | 'loading'
function handleStatus(status: Status) {
switch (status) {
case 'success':
console.log('Operation was successful')
break
case 'error':
console.log('There was an error')
break
case 'loading':
console.log('Loading...')
break
default:
const exhaustiveCheck: never = status
return exhaustiveCheck
}
}
在这里,通过 switch case
语句,我们可以保留对 Status
类型所有可能值的提示,方便在开发过程中进行处理。
satisfies
关键字
4. TypeScript 4.9 引入了 satisfies
关键字,可以帮助我们更好地进行类型检查,确保对象满足某种类型但不限制其具体的形状。
type Point = { x: number; y: number }
const point = {
x: 5,
y: 10,
z: 20,
} satisfies Point
在上面的例子中,point
对象不仅满足 Point
类型的要求,还可以有其他属性。使用 satisfies
关键字,我们可以确保对象符合预期类型,同时保留其他可能的属性。
5. 模板字符串类型的排列组合
模板字符串类型允许我们在类型层面上进行字符串拼接和组合,极大地增强了类型系统的灵活性。
type Color = 'red' | 'green' | 'blue'
type Size = 'small' | 'medium' | 'large'
type ColorSize = `${Color}-${Size}`
const colorSize: ColorSize = 'red-small' // 合法
在这里,ColorSize
类型表示所有可能的颜色和大小的组合,极大地增强了类型系统的表达能力。
6. 提取类型
有时候,我们需要从某个复杂类型中提取出某个部分的类型,TypeScript 提供了工具类型来帮助我们实现这一点。
type Person = {
name: string
age: number
address: {
street: string
city: string
}
}
type Address = Person['address']
const address: Address = {
street: '123 Main St',
city: 'New York',
}
通过使用 Person['address']
,我们可以轻松提取出 Person
类型中的 address
部分类型,方便在代码中复用。
结语
本文介绍了几个实用的 TypeScript 技巧,包括使用 never
类型检查 switch case
语句、使用互斥类型替代联合类型、保留联合类型的提示、satisfies
关键字、模板字符串类型的排列组合以及提取类型。这些技巧不仅能提高代码的类型安全性,还能增强开发者的编程体验。希望这些技巧能对你的 TypeScript 开发有所帮助。