知识运用:
题目分析:
题目地址:43-easy-exclude
如上图所示我们需要设计一个与内置Exclude功能一致的类型工具,从已知的联合类型中排除指定类型后将剩余类型返回。
题目解答:
测试用例:
/* _____________ 测试用例 _____________ */ import { Equal, Expect } from '@type-challenges/utils' type cases = [ Expect<Equal<MyExclude<"a" | "b" | "c", "a">, Exclude<"a" | "b" | "c", "a">>>, Expect<Equal<MyExclude<"a" | "b" | "c", "a" | "b">, Exclude<"a" | "b" | "c", "a" | "b">>>, Expect<Equal<MyExclude<string | number | (() => void), Function>, Exclude<string | number | (() => void), Function>>>, ]
答案与解析:
- 我们需要从一组联合类型中得到排除后的类型,考虑到有条件的存在那我们就需要使用到Ts类型编程关于条件的处理(Conditional Types)
- 语法示例:SomeType extends OtherType ? TrueType : FalseType;
- 解释说明:当SomeType类型可以分配给OtherType时得到TrueType,反之得到FalseType,这里注意关键动词为分配,区别于原来条件的理解。
- 这道题运用到了条件类型中的分布式条件类型,使得可以支持联合类型,如文档示例,可以将我们传入的联合类型分别处理成对应的数组类型并联合后返回给我们
- type ToArray = Type extends any ? Type[] : never;
- type StrArrOrNumArr = ToArray<string | number>;
- 当我们的T中的联合类型可以分配个需要排除的类型U的情况下就直接返回never,表示永不可达,反之则返回类型。
/* _____________ 答案 _____________ */ type MyExclude<T, U> = T extends U ? never : T;