Skip to content

Commit f392f5d

Browse files
committedJul 24, 2023
docs: finish chapter utility
1 parent 5bbb132 commit f392f5d

File tree

3 files changed

+32
-28
lines changed

3 files changed

+32
-28
lines changed
 

‎chapters.yml

+2
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@
1313
- enum.md: Enum 类型
1414
- assert.md: 类型断言
1515
- operator.md: 运算符
16+
- mapping.md: 类型映射
17+
- utility.md: 类型工具

‎docs/mapping.md

+17-18
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type B = {
1818
};
1919
```
2020

21-
上面示例中,这两个类型的属性结构是一样的,但是属性的类型不一样。如果属性数量多的话,写起来就很麻烦
21+
上面示例中,这两个类型的属性结构是一样的,但是属性的类型不一样。如果属性数量多的话,逐个写起来就很麻烦
2222

2323
使用类型映射,就可以从类型`A`得到类型`B`
2424

@@ -66,8 +66,6 @@ type ToBoolean<Type> = {
6666

6767
上面示例中,定义了一个泛型,可以将其他对象的所有属性值都改成 boolean 类型。
6868

69-
由于对象的属性名,只有 string、number、symbol 三种可能,所以 keyof 运算符返回的联合类型,应该是`string | number | symbol`的子类型。
70-
7169
下面是另一个例子。
7270

7371
```typescript
@@ -145,12 +143,12 @@ type Readonly<T> = {
145143

146144
```typescript
147145
type T = { a: string; b: number };
148-
149-
// {
146+
147+
type ReadonlyT = Readonly<T>;
148+
// {
150149
// readonly a: string;
151150
// readonly b: number;
152151
// }
153-
type ReadonlyT = Readonly<T>;
154152
```
155153

156154
## 映射修饰符
@@ -178,7 +176,7 @@ type B = {
178176

179177
如果要删改可选和只读这两个特性,并不是很方便。为了解决这个问题,TypeScript 引入了两个映射修饰符,用来在映射时添加或移除某个属性的`?`修饰符和`readonly`修饰符。
180178

181-
- `+`修饰符:写成`+``+readonly`,为映射属性添加`?`修饰符或`readonly`修饰符。
179+
- `+`修饰符:写成`+?``+readonly`,为映射属性添加`?`修饰符或`readonly`修饰符。
182180
- ``修饰符:写成`-?``-readonly`,为映射属性移除`?`修饰符或`readonly`修饰符。
183181

184182
下面是添加或移除可选属性的例子。
@@ -248,7 +246,7 @@ type B<T> = {
248246

249247
### 语法
250248

251-
TypeScript 4.1 引入了键名重映射(key remapping),允许将键名指定为其他类型
249+
TypeScript 4.1 引入了键名重映射(key remapping),允许改变键名
252250

253251
```typescript
254252
type A = {
@@ -281,12 +279,12 @@ interface Person {
281279
}
282280

283281
type Getters<T> = {
284-
[P in keyof T
285-
as `get${Capitalize<string & P>}`]: () => T[P];
282+
[P in keyof T
283+
as `get${Capitalize<string & P>}`]: () => T[P];
286284
};
287-
285+
288286
type LazyPerson = Getters<Person>;
289-
// 等同于
287+
// 等同于
290288
type LazyPerson = {
291289
getName: () => string;
292290
getAge: () => number;
@@ -313,20 +311,20 @@ type User = {
313311
}
314312

315313
type Filter<T> = {
316-
[K in keyof T
317-
as T[K] extends string ? K : never]: string
314+
[K in keyof T
315+
as T[K] extends string ? K : never]: string
318316
}
319317

320318
type FilteredUser = Filter<User> // { name: string }
321319
```
322320
323-
上面示例中,映射`K in keyof T`获取类型`T`的每一个属性以后,然后使用`as Type`修改键名的类型
321+
上面示例中,映射`K in keyof T`获取类型`T`的每一个属性以后,然后使用`as Type`修改键名
324322
325-
它的键盘重映射`as T[K] extends string ? K : never]`,使用了条件运算符。如果属性值`T[K]`的类型是字符串,那么属性名不变,否则属性名类型改为`never`,即这个属性名不存在。这样就等于过滤了不符合条件的属性,只保留属性值为字符串的属性。
323+
它的键名重映射`as T[K] extends string ? K : never]`,使用了条件运算符。如果属性值`T[K]`的类型是字符串,那么属性名不变,否则属性名类型改为`never`,即这个属性名不存在。这样就等于过滤了不符合条件的属性,只保留属性值为字符串的属性。
326324
327325
### 联合类型的映射
328326
329-
由于键名重映射可以修改键名类型,所以原始键名的类型不必是`string|number|symbol`任意的联合类型都可以
327+
由于键名重映射可以修改键名类型,所以原始键名的类型不必是`string|number|symbol`任意的联合类型都可以用来进行键名重映射
330328
331329
```typescript
332330
type S = {
@@ -340,7 +338,7 @@ type C = {
340338
radius: number,
341339
};
342340

343-
type MyEvents<Eevnts extends { kind: string }> = {
341+
type MyEvents<Events extends { kind: string }> = {
344342
[E in Events as E['kind']]: (event: E) => void;
345343
}
346344

@@ -357,3 +355,4 @@ type Config = {
357355
## 参考链接
358356
359357
- [Mapped Type Modifiers in TypeScript](https://mariusschulz.com/blog/mapped-type-modifiers-in-typescript), Marius Schulz
358+

‎docs/utility.md

+13-10
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type C = Awaited<boolean | Promise<number>>;
3434
`Awaited<Type>`的实现如下。
3535

3636
```typescript
37-
type Awaited<T> =
37+
type Awaited<T> =
3838
T extends null | undefined ? T :
3939
T extends object & {
4040
then(
@@ -56,7 +56,7 @@ type Awaited<T> =
5656
type T1 = ConstructorParameters<
5757
new (x: string, y: number) => object
5858
>; // [x: string, y: number]
59-
59+
6060
type T2 = ConstructorParameters<
6161
new (x?: string) => object
6262
>; // [x?: string | undefined]
@@ -88,7 +88,7 @@ type T2 = ConstructorParameters<Function>; // 报错
8888

8989
`any`类型和`never`类型是两个特殊值,分别返回`unknown[]``never`
9090

91-
```typescript
91+
```typescript
9292
type T1 = ConstructorParameters<any>; // unknown[]
9393

9494
type T2 = ConstructorParameters<never>; // never
@@ -262,12 +262,14 @@ function toHex(this: Number) {
262262
type T = OmitThisParameter<typeof toHex>; // () => string
263263
```
264264

265+
上面示例中,`OmitThisParameter<T>`给出了函数`toHex()`的类型,并将其中的`this`参数删除。
266+
265267
如果函数没有 this 参数,则返回原始函数类型。
266268

267269
`OmitThisParameter<Type>`的实现如下。
268270

269271
```typescript
270-
type OmitThisParameter<T> =
272+
type OmitThisParameter<T> =
271273
unknown extends ThisParameterType<T> ? T :
272274
T extends (...args: infer A) => infer R ?
273275
(...args: A) => R : T;
@@ -281,7 +283,7 @@ type OmitThisParameter<T> =
281283
type T1 = Parameters<() => string>; // []
282284

283285
type T2 = Parameters<(s:string) => void>; // [s:string]
284-
286+
285287
type T3 = Parameters<<T>(arg: T) => T>; // [arg: unknown]
286288

287289
type T4 = Parameters<
@@ -459,7 +461,7 @@ interface Person {
459461
age: number;
460462
}
461463

462-
const worker: Readonly<Partial<Person>>
464+
const worker: Readonly<Partial<Person>>
463465
= { name: '张三' };
464466

465467
worker.name = '李四'; // 报错
@@ -605,7 +607,7 @@ type T2 = ReturnType<never>; // never
605607
```typescript
606608
type ReturnType<
607609
T extends (...args: any) => any
608-
> =
610+
> =
609611
T extends (...args: any) => infer R ? R : any;
610612
```
611613

@@ -644,7 +646,7 @@ interface HelperThisValue {
644646

645647
let helperFunctions:
646648
{ [name: string]: Function } &
647-
ThisType<HelperThisValue>
649+
ThisType<HelperThisValue>
648650
= {
649651
hello: function() {
650652
this.logError("Error: Something wrong!"); // 正确
@@ -662,7 +664,7 @@ let helperFunctions:
662664
下面是另一个例子。
663665

664666
```typescript
665-
let obj: ThisType<{ x: number }> &
667+
let obj: ThisType<{ x: number }> &
666668
{ getX: () => number };
667669

668670
obj = {
@@ -734,10 +736,11 @@ type A = 'HELLO';
734736

735737
// "hELLO"
736738
type B = Uncapitalize<A>;
737-
```
739+
```
738740

739741
上面示例中,`Uncapitalize<T>`将 HELLO 转为 hELLO。
740742

741743
## 参考链接
742744

743745
- [What is TypeScript's ThisType used for?](https://stackoverflow.com/questions/55029032/what-is-typescripts-thistype-used-for)
746+

0 commit comments

Comments
 (0)
Please sign in to comment.