18220-medium-filter

Back

type Filter<T extends any[], P> = T extends [infer First, ...infer Rest]
  ? First extends P
    ? [First, ...Filter<Rest, P>]
    : Filter<Rest, P>
  : [];

题目要求说P是基本类型,或者基本类型的联合类型。 结果给的测试用例中P全是字面量类型,或者是带字面量类型的联合类型。 难绷(´-﹏-;)

Solution by Barrenboat #37341

Easy!

type Filter<T extends unknown[], U> =
  T extends [infer F, ...infer Rest]
    ? F extends U
      ? [F, ...Filter<Rest, U>]
      : [...Filter<Rest, U>]
    : T;

Solution by djdidi #37224

type Filter<T extends any[], P> = T extends [infer L,...infer R] ? L extends P ? [L,...Filter<R,P>] : Filter<R,P> : []

Solution by tac-tac-go #36406

// your answers

type Filter<T extends any[], P>
  = T extends [infer F, ...infer R]
  ? [...F extends P ? [F] : [], ...Filter<R, P>]
  : []


Solution by goddnsgit #36240

type Filter<T extends any[], P,Acc extends any[] = []> = T extends [infer F,...infer R] 
 ? F extends P 
 ? Filter<R,P,[...Acc,F]>
 : Filter<R,P,Acc> 
 : Acc

type Filter<T extends any[], P> = T extends [infer F,...infer R] 
 ? F extends P
 ? [F, ...Filter<R,P>]
 : Filter<R,P> 
 : []

Solution by EvilEl #35993

export type Filter<T extends Array<unknown>, F, R extends Array<unknown> = []> = T extends [
  infer First,
  ...infer Rest,
]
  ? First extends F
    ? Filter<Rest, F, [...R, First]>
    : Filter<Rest, F, R>
  : R;

Solution by gangnamssal #35857

// your answers
type Filter<T extends any[], P, Rs extends any[] = []> = 
  T extends [infer T, ... infer R] ? 
     T extends P ? Filter<R,P,[...Rs,T]> : Filter<R,P,Rs> : Rs 
     
     
type Filter<T extends any[], P> = 
  T extends [infer T, ... infer R] ? 
     T extends P ? [T, ... Filter<R,P>] : Filter<R,P> : []

Solution by Mohmn #35474

type Filter<T extends any[], P, A extends any[] = []> = T extends [infer F, ...infer Rest]
  ? F extends P
    ? Filter<Rest, P, [...A, F]>
    : Filter<Rest, P, A>
  : A;

Solution by wendao-liu #35112

type Filter<T extends any[], P, U extends any[] = []> = T extends [infer R, ...infer rest] ? R extends P ? Filter<rest, P, [...U, R]> : Filter<rest, P, U> : U

Solution by ouzexi #34145

type Filter<T extends any[],U, A extends any[] = []> = T extends [infer S, ...infer rest] ? S extends U ? [S, ...A]:Filter<rest, U>:never

Solution by rookiewxy #33916

// your answers
type Filter<T extends any[], P> =   T extends [infer L, ...infer R]
  ? [...L extends P ? [L] : [], ...Filter<R, P>]
  : []

Solution by pea-sys #33495

type Filter<T, Condition, Ret extends any[] = []> = T extends [
  infer First,
  ...infer Rest
]
  ? Filter<Rest, Condition, First extends Condition ? [...Ret, First] : Ret>
  : Ret;

Solution by sunupupup #33477

// your answers
type Filter<T extends any[], P> = T extends [infer Item, ...infer Rest]
  ? [...Item extends P ? [Item] : [], ...Filter<Rest, P>]
  : []

Solution by DevilTea #33259

type Filter<T extends unknown[], P> = T extends [infer F, ...infer R]
  ? F extends P
    ? [F, ...Filter<R, P>]
    : Filter<R, P>
  : T

Solution by keyurparalkar #32781

type Filter<T extends any[], P, Acc extends any[] = []> = T extends [infer F, ...infer Rest]
  ? F extends P
    ? Filter<Rest, P, [...Acc, F]>
    : Filter<Rest, P, Acc>
  : Acc

Solution by ZhulinskiiDanil #32724

type Filter<T extends any[], P, R extends any[] = []> = T["length"] extends 0
  ? R
  : T[0] extends P
  ? Filter<T extends [any, ...infer U] ? U : never, P, [...R, T[0]]>
  : Filter<T extends [any, ...infer U] ? U : never, P, R>;

Solution by vangie #32193

type Filter<T extends any[], P, Result extends T[number][] = []> = T extends [infer First, ...infer Rest]
  ? First extends P ? Filter<Rest, P, [...Result, First]> : Filter<Rest, P, Result>
  : Result

Solution by hwasurr #31430

type Filter<T extends any[], P, U extends any[] = []> = T extends [infer A, ...infer B] ? A extends P ? Filter<B, P, [...U, A]> : Filter<B, P, U> : U

Solution by dreamluo-plus #30691

// your answers
// 一个个筛,想了两个方式
// 除了加一个U做记录,也可以直接返回数组
// type Filter<T extends unknown[], P, U extends unknown[] = []> = T extends [
// 	infer F,
// 	...infer R
// ]
// 	? F extends P
// 		? Filter<R, P, [...U, F]>
// 		: Filter<R, P, U>
// 	: U

type Filter<T extends unknown[], P> = T extends [infer F, ...infer R]
	? F extends P
		? [F, ...Filter<R, P>]
		: [...Filter<R, P>]
	: []

Solution by bebusy007 #30031

type Filter<T extends unknown[], K> = T extends [infer F, ...infer R]
  ? F extends K
    ? [F, ...Filter<R, K>]
    : Filter<R, K>
  : [];

Solution by kanishev #29881

// your answers

type Filter<T extends any[], P> = 
            T extends [infer F , ...infer Rest] ? 
                F extends P ? [F, ...Filter<Rest, P>]
                   : Filter<Rest, P> 
                : []

Solution by kerolossamir165 #29626

type Filter<T extends any[], P> = T extends [infer Item, ...infer Rest]
  ? Item extends P
    ? [Item, ...Filter<Rest, P>]
    : Filter<Rest, P>
  : [];

Solution by DoubleWoodLin #28895

type Filter<ArrayType extends unknown[], Type> = ArrayType extends [
  infer Head,
  ...infer Tail
]
  ? [...(Head extends Type ? [Head] : []), ...Filter<Tail, Type>]
  : [];

Solution by yevhenpavliuk #28499

这题和上一题很类型,基本一样,通过添加多一个参数 Res 来存储返回结果,遍历生成 Res 数组

type Filter<T extends any[], P, Res extends any[] = []> = T extends [infer F, ...infer Rest] 
  ? F extends P
    ? Filter<Rest, P, [...Res, F]>
    : Filter<Rest, P, Res>
  : Res

在 github 上还看到了这个回答,可以直接在数组中递归,这样可以减少掉 Res 参数

type Filter<T extends unknown[], P> = T extends [infer F, ...infer R]
  ? F extends P
    ? [F, ...Filter<R, P>]
    : Filter<R, P>
  : [];

Solution by linjunc #28342

type Filter<T extends any[], P> = T extends [infer F, ...infer R]
  ? F extends P
    ? [F, ...Filter<R, P>]
    : Filter<R, P>
  : [];

Solution by slemchik03 #27575

type Filter<T extends any[], P> = T extends [infer F, ...infer R] ? F extends P ? [F, ...Filter<R, P>] : Filter<R, P> : [];

Solution by RainbowIsPerfect #27427

type Filter<T extends any[], P> =
  T extends [infer F, ...infer R] ? [...(F extends P ? [F] : []), ...Filter<R, P>] : []

Solution by smileboyi #27273

type Filter<T extends unknown[], P, Result extends unknown[] = []> = T extends [infer First, ...infer Rest]
  ? [First] extends [P]
    ? Filter<Rest, P, [...Result, First]>
    : Filter<Rest, P, Result>
  : Result;

Solution by rldnd #27015

This works with duplicates as well.

type Filter<T extends any[], P, Acc extends any[] = []> = T extends [
  infer F,
  ...infer L
]
  ? F extends P
    ? Filter<L, Exclude<P, F>, [...Acc, F]>
    : Filter<L, P, Acc>
  : Acc;

Solution by tany1 #26714

type Filter<T extends unknown[], P extends unknown> = T extends [infer X, ...infer Tail] ? X extends P ? [X, ...Filter<Tail,P>] : Filter<Tail,P>  : []

Solution by ScarboroughCoral #26572