awesome-typescript icon indicating copy to clipboard operation
awesome-typescript copied to clipboard

「重学TS 2.0 」TS 练习题第十七题

Open semlinker opened this issue 4 years ago • 22 comments

实现一个 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

提示:该题目有多种解法,感兴趣小伙伴可以自行尝试一下。 请在下面评论你的答案。

semlinker avatar Sep 16 '21 12:09 semlinker

//利用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

sunboyZgz avatar Sep 16 '21 13:09 sunboyZgz

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

zhaoxiongfei avatar Sep 16 '21 14:09 zhaoxiongfei

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

douhaoi avatar Sep 17 '21 01:09 douhaoi

type Includes<T extends Array, E> = E extends T[number] ? true : false;

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

yzycool avatar Sep 17 '21 15:09 yzycool

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

mingzhans avatar Sep 21 '21 14:09 mingzhans

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

wenye123 avatar Sep 24 '21 06:09 wenye123

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

Mrlgm avatar Sep 27 '21 12:09 Mrlgm

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;

winfa avatar Sep 27 '21 15:09 winfa

// 实现一个 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的处理

zhaoxiongfei avatar Oct 01 '21 15:10 zhaoxiongfei

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

ccbabi avatar Oct 04 '21 08:10 ccbabi

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

Flavour86 avatar Oct 22 '21 06:10 Flavour86

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]

rookiecdn avatar Nov 21 '21 06:11 rookiecdn

import IsEqual from "../11. 类型比较";

export default {}

// 实现一个 Includes 工具类型,用于判断指定的类型 E 是否包含在 T 数组类型中。具体的使用示例如下所示: type Includes<T extends Array, E> = ( T extends [infer L, ...infer R] ? IsEqual<E, L> extends true ? true : Includes<R, 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

a572251465 avatar Dec 01 '21 22:12 a572251465

type Includes<T extends any[], E> = T extends Array<infer R> ? E extends R ? true : false : false;

liulise avatar Dec 07 '21 07:12 liulise


type I0 = Includes<[1], 2> // false
type I1 = Includes<[2, 2, 3, 1], 2> // true
type I2 = Includes<[2, 3, 3, 1], 1> // true```

Ljp10086 avatar Dec 31 '21 03:12 Ljp10086

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

jeffacode avatar Feb 09 '22 11:02 jeffacode

  1. 数组转联合类型
// 将数组类型转为联合类型后,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]
  1. 递归判断是否包含
type Includes<T extends Array<any>, E> = 
  T extends [infer First, ...infer P]
    ? E extends First
      ? true
      : Includes<P, E>
    : false
  1. 直接infer数组类型 Array<infer Arr>
type Includes<T extends Array<any>, E> = 
  T extends Array<infer P> 
    ? E extends P
      ? true
      : false
    : false

waleiwalei avatar Mar 14 '22 15:03 waleiwalei

递归yyds

type Includes<T extends Array<any>, E> = T extends [infer F,...infer Rest]?F extends E?true:Includes<Rest,E>:false

ChuTingzj avatar Jun 02 '22 13:06 ChuTingzj

type Includes<T extends Array, E> = T extends [infer First, ...infer Rest] ? First extends E ? true : Includes<Rest, E> : false

hezhisheng1930 avatar Aug 11 '22 09:08 hezhisheng1930

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

fishcoderman avatar Aug 25 '22 15:08 fishcoderman

我第一反应就是这个答案

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

SweeperDuan avatar Dec 11 '23 10:12 SweeperDuan

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;

JustWantToHappy avatar Feb 12 '24 12:02 JustWantToHappy