diff --git a/docs/operator.md b/docs/operator.md index 5416439..7a51d4b 100644 --- a/docs/operator.md +++ b/docs/operator.md @@ -378,18 +378,17 @@ type T2 = RegExp extends Animal ? number : string; 一般来说,调换`extends`两侧类型,会返回相反的结果。举例来说,有两个类`Cat`和`Animal`,前者是后者的子类型,那么`Cat extends Animal`就为真,而`Animal extends Cat`就为伪。 -如果需要判断的类型是一个联合类型,那么条件运算符会展开这个联合类型。 +如果对泛型使用 extends 条件运算,有一个地方需要注意。当泛型的类型参数是一个联合类型时,那么条件运算符会展开这个类型参数,即`T = T | T`,所以 extends 对类型参数的每个部分是分别计算的。 ```typescript -(A|B) extends U ? X : Y +type Cond = T extends U ? X : Y; -// 等同于 - -(A extends U ? X : Y) | -(B extends U ? X : Y) +type MyType = Cond; +// 等同于 Cond | Cond +// 等同于 (A extends U ? X : Y) | (B extends U ? X : Y) ``` -上面示例中,`A|B`是一个联合类型,进行条件运算时,相当于`A`和`B`分别进行运算符,返回结果组成一个联合类型。 +上面示例中,泛型`Cond`的类型参数`A|B`是一个联合类型,进行条件运算时,相当于`A`和`B`分别进行条件运算,返回结果组成一个联合类型。也就是说,如果类型参数是联合类型,条件运算的返回结果依然是一个联合类型。 如果不希望联合类型被条件运算符展开,可以把`extends`两侧的操作数都放在方括号里面。 @@ -398,18 +397,18 @@ type T2 = RegExp extends Animal ? number : string; type ToArray = Type extends any ? Type[] : never; -// string[]|number[] +// 返回结果 string[]|number[] type T = ToArray; // 示例二 type ToArray = [Type] extends [any] ? Type[] : never; -// (string | number)[] +// 返回结果 (string | number)[] type T = ToArray; ``` -上面的示例一,传入`ToArray`的类型参数是一个联合类型,所以会被展开,返回的也是联合类型。示例二是`extends`两侧的运算数都放在方括号里面,所以传入的联合类型不会展开,返回的是一个数组。 +上面的示例一,泛型`ToArray`的类型参数`string|number`是一个联合类型,所以会被展开,返回的也是联合类型`string[]|number[]`。示例二是`extends`两侧的运算数都放在方括号里面,左侧是`[Type]`,右侧是`[any]`,这时传入的联合类型不会展开,返回的是一个数组`(string|number)[]`。 条件运算符还可以嵌套使用。