spinny:~/writing $ less advanced-typescript-patterns.md
12TypeScript已成为大规模Web开发的行业标准。虽然大多数开发人员都了解接口和类型的基础知识,但真正的力量在于其高级类型系统。这里有5个模式,可以让您成为一名高级工程师。34## 1. 泛型约束 (Generic Constraints)56泛型很强大,但有时您需要限制可以传入的内容。`extends` 在这里是您的朋友。78```typescript9interface HasId {10 id: string;11}1213function getById<T extends HasId>(list: T[], id: string): T | undefined {14 return list.find((item) => item.id === id);15}16```1718通过确保 `T` 扩展 `HasId`,我们要保证在函数内部访问 `.id` 是安全的。1920## 2. 条件类型 (Conditional Types)2122条件类型允许您创建非均匀的类型映射。语法类似于JavaScript中的三元运算符。2324```typescript25type IsString<T> = T extends string ? true : false;2627type A = IsString<string>; // true28type B = IsString<number>; // false29```3031一个实际的用例是从联合中过滤掉类型:3233```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```3738## 3. 映射类型 (Mapped Types)3940映射类型允许您通过转换属性基于旧类型创建新类型。4142```typescript43type ReadOnly<T> = {44 readonly [P in keyof T]: T[P];45};4647interface User {48 name: string;49 age: number;50}5152type ReadOnlyUser = ReadOnly<User>;53```5455您甚至可以添加或删除修饰符:5657```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```6263## 4. 模板字面量类型 (Template Literal Types)6465在TypeScript 4.1中引入,这些允许您直接操作字符串类型。6667```typescript68type World = 'world';69type Greeting = `hello ${World}`; // "hello world"7071type Color = 'red' | 'blue';72type Quantity = 'light' | 'dark';7374type Palette = `${Quantity}-${Color}`;75// "light-red" | "light-blue" | "dark-red" | "dark-blue"76```7778这对于键入遵循特定模式的字符串(如CSS类或事件名称)非常有用。7980## 5. `infer` 关键字8182条件类型中的 `infer` 关键字允许您从其他类型中提取类型。8384```typescript85type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;8687function check(): boolean {88 return true;89}9091type CheckReturn = ReturnType<typeof check>; // boolean92```9394在这里,我们要TypeScript“推断”函数的返回类型 `R` 并返回它。9596## 结论9798掌握这些模式可以让您编写健壮且提供出色开发人员体验(DX)的库和实用程序。高级TypeScript的目标不是为了复杂而复杂,而是为了安全性和表达力。99
:高级工程师的5个高级TypeScript模式lines 1-99 (END) — press q to close