File tree 1 file changed +9
-10
lines changed
1 file changed +9
-10
lines changed Original file line number Diff line number Diff line change @@ -378,18 +378,17 @@ type T2 = RegExp extends Animal ? number : string;
378
378
379
379
一般来说,调换` extends ` 两侧类型,会返回相反的结果。举例来说,有两个类` Cat ` 和` Animal ` ,前者是后者的子类型,那么` Cat extends Animal ` 就为真,而` Animal extends Cat ` 就为伪。
380
380
381
- 如果需要判断的类型是一个联合类型,那么条件运算符会展开这个联合类型 。
381
+ 如果对泛型使用 extends 条件运算,有一个地方需要注意。当泛型的类型参数是一个联合类型时,那么条件运算符会展开这个类型参数,即 ` T<A|B> = T<A> | T<B> ` ,所以 extends 对类型参数的每个部分是分别计算的 。
382
382
383
383
``` typescript
384
- ( A | B ) extends U ? X : Y
384
+ type Cond < T > = T extends U ? X : Y ;
385
385
386
- // 等同于
387
-
388
- (A extends U ? X : Y ) |
389
- (B extends U ? X : Y )
386
+ type MyType = Cond <A | B >;
387
+ // 等同于 Cond<A> | Cond<B>
388
+ // 等同于 (A extends U ? X : Y) | (B extends U ? X : Y)
390
389
```
391
390
392
- 上面示例中,` A|B ` 是一个联合类型,进行条件运算时,相当于` A ` 和` B ` 分别进行运算符 ,返回结果组成一个联合类型。
391
+ 上面示例中,泛型 ` Cond ` 的类型参数 ` A|B ` 是一个联合类型,进行条件运算时,相当于` A ` 和` B ` 分别进行条件运算 ,返回结果组成一个联合类型。也就是说,如果类型参数是联合类型,条件运算的返回结果依然是一个联合类型 。
393
392
394
393
如果不希望联合类型被条件运算符展开,可以把` extends ` 两侧的操作数都放在方括号里面。
395
394
@@ -398,18 +397,18 @@ type T2 = RegExp extends Animal ? number : string;
398
397
type ToArray <Type > =
399
398
Type extends any ? Type [] : never ;
400
399
401
- // string[]|number[]
400
+ // 返回结果 string[]|number[]
402
401
type T = ToArray <string | number >;
403
402
404
403
// 示例二
405
404
type ToArray <Type > =
406
405
[Type ] extends [any ] ? Type [] : never ;
407
406
408
- // (string | number)[]
407
+ // 返回结果 (string | number)[]
409
408
type T = ToArray <string | number >;
410
409
```
411
410
412
- 上面的示例一,传入 ` ToArray<Type> ` 的类型参数是一个联合类型 ,所以会被展开,返回的也是联合类型。示例二是` extends ` 两侧的运算数都放在方括号里面,所以传入的联合类型不会展开, 返回的是一个数组。
411
+ 上面的示例一,泛型 ` ToArray<Type> ` 的类型参数 ` string|number ` 是一个联合类型 ,所以会被展开,返回的也是联合类型` string[]|number[] ` 。示例二是` extends ` 两侧的运算数都放在方括号里面,左侧是 ` [Type] ` ,右侧是 ` [any] ` ,这时传入的联合类型不会展开, 返回的是一个数组` (string|number)[] ` 。
413
412
414
413
条件运算符还可以嵌套使用。
415
414
You can’t perform that action at this time.
0 commit comments