Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

43 Exclude

关键词: TypeScript, TypeChallenge

实现内置的Exclude类

例如

type T0 = MyExclude<"a" | "b" | "c", "a">; // expected "b" | "c"
type T1 = MyExclude<string | number | boolean, string | Function>; // expected number | boolean

答案

type MyExclude<T, E> = T extends E ? never : T;

分析

当使用条件类型时, TS 会进行"分配" 的操作, 举例:

// 不使用条件, 不分配
type NotActuallyToArray<Type> = Type[];
// 使用条件, 分配, `Type extends any`恒为true, 这里只是为了开启分配的功能
type ToArray<Type> = Type extends any ? Type[] : never;

type StrArr_Or_NumArr = ToArray<string | number>; // string[] | number[]
type StrOrNum_Arr = NotActuallyToArray<string | number>; // (string | number)[]

所以, 这里我们使用 T 的时候其实得到的不是传入的那个union类型, 而是其中的每一项.
对于原本类型中的每一项, 如果E(待排除的union)中包含它则舍弃, 否则保留

type MyExclude<T, E> = T extends E ? never : T;

伪码如下

function MyExclude(T, E) {

  const returnType = never
  for(let t of T) {
    if(t is subset of E) continue
    else returnType |= t
  }

  return returnType
}