awesome-typescript
awesome-typescript copied to clipboard
「重学TS 2.0 」TS 练习题第十七题
实现一个 Includes 工具类型,用于判断指定的类型 E 是否包含在 T 数组类型中。具体的使用示例如下所示:
type Includes<T extends Array<any>, E> = // 你的实现代码
type I0 = Includes<[], 1> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // true
提示:该题目有多种解法,感兴趣小伙伴可以自行尝试一下。 请在下面评论你的答案。
//利用11题编写的isEqual
type Includes<T extends Array<any>, E> = T extends [infer A, ...infer B]
? IsEqual<A, E> extends true
? true
: Includes<B, E>
: false;
type I0 = Includes<[], 1>; // false
type I1 = Includes<[2, 2, 3, 1], 2>; // true
type I2 = Includes<[2, 3, 3, 1], 1>; // true
type UnionByArr<T extends Array<any>> = T extends [infer F, ...infer R] ? F | UnionByArr<R> : never;
type Includes<T extends Array<any>, E> = E extends UnionByArr<T> ? true : false;
type I0 = Includes<[], 1>; // false
type I1 = Includes<[2, 2, 3, 1], 2>; // true
type I2 = Includes<[2, 3, 3, 1], 1>; // true
type Includes<T extends any[], U> = U extends T[number] ? true : false;
type I0 = Includes<[], 1>; // false
type I1 = Includes<[2, 2, 3, 1], 2>; // true
type I2 = Includes<[2, 3, 3, 1], 1>; // true
type Includes<T extends Array
type I0 = Includes<[], 1> // false type I1 = Includes<[2, 2, 3, 1], 2> // true 解析: T[number] == 2 | 2 | 3 | 1 type I2 = Includes<[2, 3, 3, 1], 1> // true
type Includes<T extends Array<any>, E> = E extends T[number] ? true : false// 你的实现代码
type I0 = Includes<[], 1> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // true
type GetArrayItemTypes<T extends Array<any>> = T extends Array<infer A> ? A : never;
type Includes<T extends Array<any>, E> = E extends GetArrayItemTypes<T> ? true : false; // 你的实现代码
type I0 = Includes<[], 1>; // false
type I1 = Includes<[2, 2, 3, 1], 2>; // true
type I2 = Includes<[2, 3, 3, 1], 1>; // true
type Includes<T extends Array<any>, E> = T extends [infer U, ...infer Arg] ? E extends U ? true : Includes<Arg, E> : false;
type I0 = Includes<[], 1> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // true
type Includes<T extends Array<any>, E> = // 你的实现代码 type I0 = Includes<[], 1> // false type I1 = Includes<[2, 2, 3, 1], 2> // true type I2 = Includes<[2, 3, 3, 1], 1> // true
type ArrayValue<T extends Array<any>> = T[number];
type Includes<T extends Array<any>, E> = E extends ArrayValue<T> ? true : false;
// 实现一个 Includes 工具类型,用于判断指定的类型 E 是否包含在 T 数组类型中。具体的使用示例如下所示:
type IsEqual<A, B> = [A] extends [B] ? [B] extends [A] ? true : false: false;
type Includes<T extends Array<any>, E> = T extends [infer A, ...infer B]
? IsEqual<A, E> extends true
? true
: Includes<B, E>
: false;
type I0 = Includes<[], 1> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // true
type I3 = Includes<[2 | 3, 3, 3, 1], 2 | 3 | 4> // false
type I4 = Includes<[2 | 3, 3, 3, 1], 2 | 3> // false
type I5 = Includes<[never, 3, 3, 1], never> // true
这个题和IsEqual那个一样,要注意联合类型以及never的处理
type Includes<T extends Array<any>, E> = ((...r: T) => void) extends (
f: infer F,
...r: infer R
) => void
? unknown extends F
? false
: E extends F
? true
: Includes<R, E>
: never;
type I0 = Includes<[], 1>; // false
type I1 = Includes<[2, 2, 3, 1], 2>; // true
type I2 = Includes<[2, 3, 3, 1], 1>; // true
type Includes<T extends Array<any>, E> = E extends T[number] ? true : false
type I0 = Includes<[], 1> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // true
type Push<T extends any[], V> = T extends [infer A, ...infer B] ? A extends V ? true : Push<B, V> : false // T extends [...infer U] ? [...U, V] : never // 你的实现代码
// 测试用例 type Arr01 = Push<[], 1> // [1] type Arr11 = Push<[1, 2, 3], 4> // [1, 2, 3, 4] type Arr12 = Push<[1, 2, 4], 4> // [1, 2, 3, 4]
import IsEqual from "../11. 类型比较";
export default {}
// 实现一个 Includes 工具类型,用于判断指定的类型 E 是否包含在 T 数组类型中。具体的使用示例如下所示:
type Includes<T extends Array
type I0 = Includes<[], 1> // false type I1 = Includes<[2, 2, 3, 1], 2> // true type I2 = Includes<[2, 3, 3, 1], 1> // true
type Includes<T extends any[], E> = T extends Array<infer R> ? E extends R ? true : false : false;
type I0 = Includes<[1], 2> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // true```
type Includes<T extends Array<any>, E> = T extends [infer P, ...infer Q]
? P extends E
? true
: Includes<Q, E>
: false
type I0 = Includes<[], 1> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // true
- 数组转联合类型
// 将数组类型转为联合类型后,extends判断即可
type Includes<T extends Array<any>, E> =
E extends Arr2Union<T> ? true : false
type I0 = Includes<[], 1> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // false
// type A = [1,2,3][number]
type Arr2Union<T extends unknown[]> = T[number]
- 递归判断是否包含
type Includes<T extends Array<any>, E> =
T extends [infer First, ...infer P]
? E extends First
? true
: Includes<P, E>
: false
- 直接infer数组类型 Array<infer Arr>
type Includes<T extends Array<any>, E> =
T extends Array<infer P>
? E extends P
? true
: false
: false
递归yyds
type Includes<T extends Array<any>, E> = T extends [infer F,...infer Rest]?F extends E?true:Includes<Rest,E>:false
type Includes<T extends Array
type Includes<T extends Array<any>, E> = E extends T[number] ? true : false; // 你的实现代码
type I0 = Includes<[], 1>; // false
type I1 = Includes<[2, 2, 3, 1], 2>; // true
type I2 = Includes<[2, 3, 3, 1], 1>; // true
我第一反应就是这个答案
type Includes<T extends Array<any>, E> = E extends T[number] ? true : false
type I0 = Includes<[], 1> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // true
type IsEqual<T, U> = [T, U] extends [U, T] ? true : false;
type Includes<T extends Array<any>, E> = T["length"] extends 0
? false
: T extends [infer R, ...infer Rest]
? IsEqual<R, E> extends true
? true
: Includes<Rest, E>
: false;